2016-01-27 142 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 
}