【问题标题】:swift3 - update ui with data from backgroundswift3 - 使用后台数据更新 ui
【发布时间】: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


【解决方案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)
            }
        }

我希望,这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2021-06-02
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多