为什么从调用DispatchQueue.main.async的位置来说这很重要?

问题描述 投票:1回答:2

我写了以下几段代码:

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.一个完成就好了。

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

ios swift grand-central-dispatch dispatch-queue
2个回答
3
投票

差异如下所述。

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

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

如果有任何疑问请注意。


0
投票

调度队列是线程安全的,这意味着您可以同时从多个线程访问它们。始终从主队列更新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

© www.soinside.com 2019 - 2024. All rights reserved.