Почему важно, откуда вы вызываете DispatchQueue.main.async? - PullRequest
0 голосов
/ 16 сентября 2018

Я написал следующие фрагменты кода:

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()
        }
    }
}

(разница заключается в том, откуда вызывается async)

1. Сбои 1.self.cameraButton.isEnabled = false can only be called from main thread

2. Один хорошо заканчивается.

Может кто-нибудь объяснить, почему это так?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Очереди отправки являются поточно-ориентированными, что означает, что вы можете обращаться к ним из нескольких потоков одновременно. Всегда обновляйте элементы интерфейса из главной очереди.

В первом коде вы обновляете пользовательский интерфейс в разных потоках не из основного потока.

Для получения дополнительной ссылки вы можете перейти по этой ссылке -

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

0 голосов
/ 16 сентября 2018

Разница описана ниже.

В коде 1st ваш checkForCameraAuthorization обратный вызов выполняется в другом потоке, и вы должны знать, что задача, связанная с UIApplication / UI, должна выполняться восновной поток.

В коде 2nd после получения обратного вызова в checkForCameraAuthorization вы выполняете задачу, связанную с пользовательским интерфейсом, в основном потоке, поэтому она отлично работает.

Если есть сомнения, пожалуйста, прокомментируйте.

...