为什么从您调用DispatchQueue.main.async的位置起什么作用呢?

时间:2018-09-16 06:03:26

标签: ios swift grand-central-dispatch dispatch-queue

我编写了以下代码:

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

有人可以解释为什么吗?

2 个答案:

答案 0 :(得分:3)

差异如下所述。

第一个代码中,您的--cpu-max-prime回调在另一个线程中执行,您应该知道与UIApplication / UI相关的任务应该在主线程中执行。

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

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

答案 1 :(得分: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