为什么从哪里调用 DispatchQueue.main.async 很重要?



我写了以下代码段:

DispatchQueue.main.async {
self.cameraManager.checkForCameraAuthorization(deniedCallback: {
self.presentDeniedAlert()
self.activityIndicator.stopAnimating()
}) {
self.cameraAccess = true
self.cameraButton.isEnabled = false
self.activityIndicator.stopAnimating()
}
}

cameraManager.checkForMicrophoneAuthorization(deniedCallback: {
self.presentDeniedAlert()
self.activityIndicator.stopAnimating()
}) {
DispatchQueue.main.async {
self.microphoneAccess = true
self.microphoneButton.isEnabled = false
self.activityIndicator.stopAnimating()
}
}
}

(区别在于调用异步的位置(

1. 崩溃self.cameraButton.isEnabled = false can only be called from main thread

2.一个完成得很好。

有人可以解释一下,为什么会这样吗?

差异如下所述。

第一个代码中,您的checkForCameraAuthorization回调在不同的线程中执行,您应该知道 UIApplication/UI 相关任务应该在主线程中执行。

在获取回调后的第二个代码中checkForCameraAuthorization您在主线程中执行与 UI 相关的任务,因此它工作正常。

如有任何疑问,请发表评论。

调度队列是线程安全的,这意味着您可以同时从多个线程访问它们。始终从主队列更新 UI 元素。

在第一个代码中,您将更新不同线程上的 UI,而不是来自主线程。

有关更多参考,您可以点击以下链接 -

https://www.quora.com/Why-must-the-UI-always-be-updated-on-Main-Thread#

https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

相关内容

  • 没有找到相关文章

最新更新