2016-01-27 139 views
0

当我运行以下代码时,我几乎可以立即打印响应,但是,可能需要十秒或更长时间才能显示在我的视图中。看起来大多数类似的问题是由会话和处理程序在不同线程上引起的。但为什么它最终会起作用?很迷茫......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() 
} 
+0

尝试google.com的网址,也许您的服务器很慢。 – Lumialxk

+0

我通常可以在几分之一秒内打印对Xcode控制台的响应。 – squarehippo10

回答

1

您需要将您的用户界面更新发送到主队列,如果您尝试更新而不将其发送到主队列,则可能需要花费时间花一分钟来更新它。

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

谢谢Amirn和Reshmi。我实际上有两个问题 - 第一,我遗漏了完成(),第二,正如你所说的,我需要使用dispatch_async(dispatch_get_main_queue()){}我添加了更新到viewDidLoad中调用的updateUI函数,它工作的很好! – squarehippo10

1

用途:

dispatch_async(dispatch_get_main_queue()){

///加载你的UI

}

0

对于斯威夫特3您可以使用此:

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