swift3 - 使用后台数据更新 ui
Posted
技术标签:
【中文标题】swift3 - 使用后台数据更新 ui【英文标题】:swift3 - update ui with data from background 【发布时间】: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 捕获的?我该如何解决它? 【参考方案1】:你试过了吗?
token.success = item in
print("Success")
DispatchQueue.main.async
self.updateUI()
【讨论】:
在失败的情况下也可能想要更新UI。但 OOPer 是对的——原始代码在将令牌添加到网络队列后立即将 updateUI 添加到队列中。谁知道哪个会先执行?相反,您可以在所有三个地方添加“进行中”的 UI 状态和 updateUI... 是的,我尝试将 DispatchQueue 放入成功闭包中,但我需要先让完成 token.success func 才能使用令牌完成工作(解析、存储等)【参考方案2】:就我而言,我需要在后台模式下更新 UI。我是一个 UIProgressView 和计时器。虽然耗时,但我更新了进度视图以显示剩余时间。但是当用户点击主页按钮时,应用程序进入免费模式,用户界面不会更新。为了克服这个问题,我使用 DispatchQueue 和 .background 选项。
DispatchQueue.global(qos: .background).async
DispatchQueue.main.async
let fractionalProgress = Float(self.counter) / 60.0
let animated = self.counter != 0
self.barProgress.setProgress(fractionalProgress, animated: animated)
我希望,这会对某人有所帮助。
【讨论】:
以上是关于swift3 - 使用后台数据更新 ui的主要内容,如果未能解决你的问题,请参考以下文章