Означает ли использование dispatch_get_main_queue(), что мой код будет в основном потоке?

Работает ли следующий код в основном потоке? "Основная очередь" относится к основному потоку?

dispatch_async(dispatch_get_main_queue(),
^{
   // Some code
});

3 ответа

Решение

Асинхронная часть диспетчерской асинхронной синхронизации отличается от параллельной последовательной передачи. Async означает, что функция немедленно возвращается, синхронизация означает, что она будет ждать выполнения блока. Поскольку основной поток / очередь является последовательным, все будет выполняться по порядку - я полагаю, это означает, что, поскольку вы запрашиваете его асинхронную отправку в том же потоке, из которого вы отправляете, он немедленно вернется, дождитесь конец текущего цикла выполнения и все остальное в очереди, а затем выполнить ваш блок.

Это более полезно для внутренней очереди, чем для основного потока: вы можете обработать свои данные, сообщить пользовательскому интерфейсу об обновлении и продолжить обработку, не дожидаясь перерисовки всего, и т. Д. Вот почему вы часто будете видеть dispatch_async вызов основного потока внутри другого dispatch_async (параллельной очереди) вместо просто dispatch_sync.

Да. С сайта разработчика Apple:

Среда диспетчеризации предоставляет последовательную очередь по умолчанию для использования приложением. Эта очередь доступна через dispatch_get_main_queue().

Это задокументировано в нескольких местах, включая документы для dispatch_get_main_queue() сам. Руководство по программированию параллелизма гласит:

Основная очередь отправки - это глобально доступная последовательная очередь, которая выполняет задачи в главном потоке приложения.

Другие вопросы по тегам