NSURLSession完成处理程序非常慢
问题描述:
当我运行以下代码时,我几乎可以立即打印响应,但是,可能需要十秒或更长时间才能显示在我的视图中。看起来大多数类似的问题是由会话和处理程序在不同线程上引起的。但为什么它最终会起作用?很迷茫......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()
}
答
您需要将您的用户界面更新发送到主队列,如果您尝试更新而不将其发送到主队列,则可能需要花费时间花一分钟来更新它。
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
答
用途:
dispatch_async(dispatch_get_main_queue()){
///加载你的UI
}
答
对于斯威夫特3您可以使用此:
DispatchQueue.main.async() {
self._eyeColor = eyeColor
}
尝试google.com的网址,也许您的服务器很慢。 – Lumialxk
我通常可以在几分之一秒内打印对Xcode控制台的响应。 – squarehippo10