NSURLSession 完成处理程序非常慢
NSURLSession completion handler very slow
当我 运行 以下代码时,我几乎可以立即打印响应,但是,它可能需要十秒或更长时间才能出现在我的视图中。似乎大多数类似的问题是由会话和处理程序在不同线程上引起的。但为什么它最终会起作用?很迷茫...
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_async(dispatch_get_main_queue())
{
/// 加载您的 UI
}
您需要将 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
}
当我 运行 以下代码时,我几乎可以立即打印响应,但是,它可能需要十秒或更长时间才能出现在我的视图中。似乎大多数类似的问题是由会话和处理程序在不同线程上引起的。但为什么它最终会起作用?很迷茫...
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_async(dispatch_get_main_queue()) {
/// 加载您的 UI
}
您需要将 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
}