NSURLSession 完成处理程序非常慢

Posted

技术标签:

【中文标题】NSURLSession 完成处理程序非常慢【英文标题】:NSURLSession completion handler very slow 【发布时间】:2016-01-27 05:43:39 【问题描述】:

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

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

【问题讨论】:

试试 google.com 作为 url,可能你的服务器很慢。 我通常可以在几分之一秒内将响应打印到 Xcode 的控制台。 【参考方案1】:

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

【讨论】:

感谢 Amirn 和 Reshmi。我实际上有两个问题 - 首先我遗漏了 completed() ,其次,正如你们所说,我需要使用 dispatch_async(dispatch_get_main_queue()) 我将后者添加到我在 viewDidLoad 中调用的 updateUI 函数中,它工作得很好! 【参考方案2】:

使用:

dispatch_async(dispatch_get_main_queue())

/// 加载你的用户界面

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于NSURLSession 完成处理程序非常慢的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession“完成处理程序”内的导航不起作用

从自定义类管理 NSURLSession 的完成处理程序

NSURLSession错误处理

NSURLSession下载文件-代理

NSURLSession 未下载完整数据,但成功完成

nsurlsession 用于循环中的多个请求