2012-05-11 8 views
16

Выполняет ли следующий код в основном потоке? «Основная очередь» относится к основному потоку?Использует ли dispatch_get_main_queue(), что мой код будет в основном потоке?

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

Обратите внимание, что если вы это сделаете и ** ВЫ НАЖНО ** на основной теме, на самом деле это ** QUITE HARMLESS **. Это очень удобно, когда у вас сложный сетевой код! :) – Fattie

ответ

27

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

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

24

Да. Из Apple developer site:

Структура отправки обеспечивает последовательные очереди по умолчанию для приложения для использования. Доступ к этой очереди осуществляется через dispatch_get_main_queue().

+1

Гарантируется, что он будет работать в основном потоке только в том случае, если существует цикл запуска, связанный с основным потоком. – CouchDeveloper

8

Это документировано в нескольких местах, включая docs for dispatch_get_main_queue() itself. Concurrency Programming Guide говорит:

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

+2

Не совсем корректно: он гарантированно работает на основном потоке, только если есть цикл запуска, связанный с основным потоком. В противном случае блок, отправленный через 'dispatch_async (dispatch_get_main_queue(), block)', может выполняться в любом потоке. – CouchDeveloper

+1

Основной поток всегда имеет цикл запуска в приложении Cocoa, @CouchDeveloper. –

+0

@JoshCaswell OP не упоминает Cocoa;) – CouchDeveloper