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 完成处理程序非常慢的主要内容,如果未能解决你的问题,请参考以下文章