【发布时间】:2016-08-22 14:22:51
【问题描述】:
很难使用后台线程中的数据更新 UI。我阅读了大量文档,但仍然遗漏了一些东西......
func getData(){
DispatchQueue.global(qos: .background).async {
let token = GetTokenOperation()
token.success = { item in
print("Success")
}
token.failure = {error in
print(error.localizedDescription)
}
NetworkQueue.shared.addOperation(op: token)
DispatchQueue.main.async {
// qos' default value is ´DispatchQoS.QoSClass.default`
self.updateUI()
}
}
}
self.updateUI() 在打印“Success”之前执行。当我将 self.updateUI() 放入闭包 token.success 中时,它确实会崩溃。
【问题讨论】:
-
据我所知,Apple 不允许从后台线程更新 UI。
-
是的,这就是为什么我要问如何正确地做到这一点。
-
好吧,至少这在 Swift3 中是一个挑战。
-
是否要在 NetworkQueue.shared.addOperation(op: token) 完成后更新 UI?如果是,那么这就是问题所在:无法保证 self.updateUI 将在该操作完成后启动。
-
这样 NetworkQueue.shared.addOperation(op: token) 正在创建另一个线程,这不是我的 DispatchQueue 捕获的?我该如何解决它?
标签: swift3