Ios NSURLSession完成处理程序非常慢

Ios NSURLSession完成处理程序非常慢,ios,swift2,nsurlsession,completionhandler,Ios,Swift2,Nsurlsession,Completionhandler,当我运行下面的代码时,我几乎可以立即打印响应,但是,它可能需要10秒或更长时间才能显示在我的视图中。似乎大多数类似的问题都是由会话和处理程序位于不同的线程上引起的。但为什么它最终会起作用呢?非常困惑 func downloadDetails(completed: DownloadComplete) { let url = NSURL(string: _detailsURL)! let session = NSURLSession.sharedSession() let task

当我运行下面的代码时,我几乎可以立即打印响应,但是,它可能需要10秒或更长时间才能显示在我的视图中。似乎大多数类似的问题都是由会话和处理程序位于不同的线程上引起的。但为什么它最终会起作用呢?非常困惑

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\u async(dispatch\u get\u main\u queue()) {

///加载你的用户界面

}使用:

dispatch\u async(dispatch\u get\u main\u queue()) {

///加载你的用户界面


}

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

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

对于Swift 3,您可以使用:

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

尝试使用google.com作为url,可能您的服务器速度较慢。我通常可以在几分之一秒内将响应打印到Xcode的控制台。尝试使用google.com作为url,可能您的服务器速度较慢。我通常可以在几分之一秒内将响应打印到Xcode的控制台。谢谢Amirn和Reshmi。实际上我有两个问题-第一个是我忽略了completed(),第二个是,正如你们都说的,我需要使用dispatch_async(dispatch_get_main_queue()){}我将后者添加到我的updateUI函数viewDidLoad中,它工作得很好!谢谢阿米恩和瑞斯米。实际上我有两个问题-第一个是我忽略了completed(),第二个是,正如你们都说的,我需要使用dispatch_async(dispatch_get_main_queue()){}我将后者添加到我的updateUI函数viewDidLoad中,它工作得很好!