NSURLSession 完成处理程序非常慢

NSURLSession completion handler very slow

当我 运行 以下代码时,我几乎可以立即打印响应,但是,它可能需要十秒或更长时间才能出现在我的视图中。似乎大多数类似的问题是由会话和处理程序在不同线程上引起的。但为什么它最终会起作用?很迷茫...

func downloadDetails(completed: DownloadComplete) {
   let url = NSURL(string: _detailsURL)!
   let session = NSURLSession.sharedSession()
   let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

      do {
         let dict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]

             if let eyeColor = dict["eyeColor"] as? String {
                self._eyeColor = eyeColor
             }
          }
          catch {
             print("json error: \(error)")
          }
   }
   task.resume()
}

使用:

dispatch_async(dispatch_get_main_queue()) {

/// 加载您的 UI

}

您需要将 UI 更新发送到主队列,如果您尝试更新它而不将其发送到主队列,可能需要一分钟多的时间来更新它。

func downloadDetails(completed: DownloadComplete) {
    let url = NSURL(string: _detailsURL)!
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

        do {
            let dict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]

            if let eyeColor = dict["eyeColor"] as? String {
                dispatch_async(dispatch_get_main_queue()) {
                    self._eyeColor = eyeColor
                }
            }
        }
        catch {
            print("json error: \(error)")
        }
    }
    task.resume()
}

对于 Swift 3 你可以使用这个:

DispatchQueue.main.async() {
   self._eyeColor = eyeColor
}