Вопрос новичка на DispatchQueue.main.async - PullRequest
0 голосов
/ 03 марта 2020

В MainViewController, в viewDidLoad() Я вызываю функцию, которая в свою очередь проверяет, если Auth.auth().currentUser == nil; Если условие выполнено, то оператор для выполнения представляет другой контроллер представления.

В операторе if, почему оператору для выполнения должен предшествовать DispatchQueue.main.async (если я не пишу DispatchQueue.main.async, то контроллер представления не отображается и он просто застрял на MainViewController).

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

Поскольку во время вызова viewDidLoad ваш контроллер представления еще не был добавлен в иерархию представления. Контроллер представления, который не является частью иерархии представления, не может представить другой контроллер представления. Вы должны получить сообщение журнала в консоли, говорящее о чем-то похожем на это, когда вы пытаетесь представить другой контроллер представления без асинхронной c отправки.

Ввод вызова в DispatchQueue.main.async приводит к задержке презентации до следующего цикла runl oop, который окажется достаточным для того, чтобы ваш контроллер представления был добавлен в иерархию представлений после его вызова.

Лучшим решением было бы поставить проверку текущего пользователя в более подходящую место, возможно viewDidAppear.

0 голосов
/ 03 марта 2020

Dispatch.main.asyn c используется по той причине, что все связанные с пользовательским интерфейсом должны выполняться в mainQueue. Поскольку представление UIViewController является задачей пользовательского интерфейса, следовательно, выполняется в mainQueue

Кроме того, чтобы ответить, почему он не отображается, когда Dispatch.main не используется, возможно, вы выполняете его в потоке, который не является основным.

...