[swift]NSURLConnection 不调用方法 (工作第一次)

标签: json ios Swift
发布时间: 2017/3/5 3:13:26
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

所以我使用 NSURLConnection 从网站获取 JSON 数据,它的工作和我将数据存储在搜索控制器 / 表视图。现在当用户单击视图中的某个单元格上时我想要延伸到新的视图,并加载另一组 JSON 数据从一个网站。然而,在这新的视图中的连接永远不会运行的方法。这里是我做的两次 (每个不同的视图控制器)

func startConnection(){
    var url: NSURL = NSURL(string: self.formatted)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode) // I tried to put this in based on suggestions from searches I did, it didn't help
    connection.start()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)

}

func connectionDidFinishLoading(connection: NSURLConnection!){
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
    println(jsonResult)

}

从断点,它看起来像它从来没有运行︰

func connection(connection: NSURLConnection!, didReceiveData data: NSData!)

我打电话 startConnection()ViewDidLoad

解决方法 1:

实现 connection:didFailWithError: ,太。看到它的报告。如果不是这样,你根本无从知道它失败的原因。

func connection(connection: NSURLConnection, didFailWithError error: NSError) {
    println("connection error = \(error)")
}

此外,在 didReceiveData (和其他这些方法), NSURLConnection 参数不是可选的。回这些被审计之前,他们可能用过隐式打开包装的件,但不再。仔细检查你的方法签名。如果你实际上你将类定义为明确符合 NSURLConnectionDataDelegateNSURLConnectionDelegate ,你应该对此警告。


顺便说一句,你没有使用 NSError 变量中 connectionDidFinishLoading ,可以填充如果 JSONObjectWithData 遇到了任何问题的响应进行解析。所以供应, NSError 变量 JSONObjectWithData ,你现在可以诊断在分析期间出现的任何错误。希望你不会有任何分析的错误,但是如果你做过,有 NSError 的引用将非常有用。

还有,你不需要 startImmediatelyfalse 和手动调度它主要运行循环。你只有这样做,如果你正在启动此连接从后台线程。但既然你打电话这从 viewDidLoad ,这是没有必要。

所以它可能看起来像︰

func startConnection() {
    data = NSMutableData()
    let url = NSURL(string: formatted)
    let request = NSURLRequest(URL: url!)
    NSURLConnection(request: request, delegate: self)
}

func connection(connection: NSURLConnection, didReceiveData data: NSData) {
    self.data.appendData(data)
}

func connectionDidFinishLoading(connection: NSURLConnection) {
    var error: NSError?
    if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as? NSDictionary {
        println(jsonResult)
    } else {
        println("parsing error = \(error)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString)")
    }
}

func connection(connection: NSURLConnection, didFailWithError error: NSError) {
    println("connection error = \(error)")
}

顺便说一句,你也可能想要执行 didReceiveResponse ,也可以提供有关服务器的任何错误的信息,您可能会收到︰

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
    if let httpResponse = response as? NSHTTPURLResponse {
        let statusCode = httpResponse.statusCode

        if statusCode != 200 {
            println("expected HTTP response of 200; received \(statusCode)")
            println(httpResponse)
        }
    } else {
        println("expected HTTP response; but didn't get any")
    }
}
官方微信
官方QQ群
31647020