NSURLSession完成处理程序非常慢

当我运行以下代码时,我几乎可以立即打印一个响应,但是,在我的视图中可能需要十秒或更长时间。 似乎最类似的问题是由会话和处理程序在不同的线程上引起的。 但为什么最终会奏效呢? 很困惑…

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() } 

您需要将您的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() } 

使用 :

dispatch_async(dispatch_get_main_queue()){

///加载您的用户界面

}

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

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