Выполняет ли следующий код в основном потоке? «Основная очередь» относится к основному потоку?Использует ли dispatch_get_main_queue(), что мой код будет в основном потоке?
dispatch_async(dispatch_get_main_queue(),
^{
// Some code
});
Выполняет ли следующий код в основном потоке? «Основная очередь» относится к основному потоку?Использует ли dispatch_get_main_queue(), что мой код будет в основном потоке?
dispatch_async(dispatch_get_main_queue(),
^{
// Some code
});
Асинхронная часть отправки async vs sync отличается от параллельной и последовательной. Async означает, что функция возвращается немедленно, синхронизация означает, что она будет ждать, пока блок не будет выполнен. Поскольку основной поток/очередь является серийным, все будет выполнено в порядке - I верят Это означает, что, поскольку вы запрашиваете его для отправки асинхронного сообщения в том же потоке, от которого вы отправляете, он немедленно вернется, дождитесь окончания текущего цикла цикла и всего остального в очереди, а затем выполните свой блок.
Это более полезно для внутренней очереди, чем в основном потоке, - вы можете обрабатывать свои данные, позволять пользовательскому интерфейсу знать, обновлять и продолжать обработку, не дожидаясь, пока все будет перерисовано, и т. Д. Вот почему вы будете часто видят вызов dispatch_async в основной поток внутри другого dispatch_async (параллельная очередь) вместо просто dispatch_sync.
Да. Из Apple developer site:
Структура отправки обеспечивает последовательные очереди по умолчанию для приложения для использования. Доступ к этой очереди осуществляется через dispatch_get_main_queue().
Гарантируется, что он будет работать в основном потоке только в том случае, если существует цикл запуска, связанный с основным потоком. – CouchDeveloper
Это документировано в нескольких местах, включая docs for dispatch_get_main_queue()
itself. Concurrency Programming Guide говорит:
Основная очередь отправки - это глобально доступная последовательная очередь, выполняющая задачи в основном потоке приложения.
Не совсем корректно: он гарантированно работает на основном потоке, только если есть цикл запуска, связанный с основным потоком. В противном случае блок, отправленный через 'dispatch_async (dispatch_get_main_queue(), block)', может выполняться в любом потоке. – CouchDeveloper
Основной поток всегда имеет цикл запуска в приложении Cocoa, @CouchDeveloper. –
@JoshCaswell OP не упоминает Cocoa;) – CouchDeveloper
Обратите внимание, что если вы это сделаете и ** ВЫ НАЖНО ** на основной теме, на самом деле это ** QUITE HARMLESS **. Это очень удобно, когда у вас сложный сетевой код! :) – Fattie