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的主要内容,如果未能解决你的问题,请参考以下文章

后台位置的核心数据更新位置导致阻塞 UI

在后台线程内循环并不断更新 UI 时使用啥?

Swift3:用户输入的实时 UiLabel 更新

如何使用 FCM 后台通知更新 UI?

java 可以使用v7.1 UI.access()方法执行后台任务以在Vaadin中执行后台工作和安全UI更新。目前

在页面切换时使用RxJava持续更新UI界面