2012-02-08 1 views
18

Я читаю документы в диспетчерских очередях для GCD, и в нем они говорят, что очереди FIFO, поэтому я искажаю, какое влияние это оказывает на рассылку async/sync?Grand Central Dispatch async vs sync

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

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

Мои вопросы: есть ли здесь асинхронное использование? я что-то пропустил в своем понимании этих двух вещей.

ответ

12

sync означает функцию WILL BLOCK текущей нити, пока она не завершится, async означает, что она будет обработана в фоновом режиме, и функция НЕ БЛОКЕТЬ текущую нить.

Если вы хотите последовательное выполнение блоков проверить создание последовательной очереди отправки

+0

ах да, что очищает его прохладные спасибо за это. Да, я использую серийные очереди сейчас. Я просто не был уверен, где теперь это преимущество. Благодарю. –

24

Первый ответ не является достаточно полной, к сожалению. Да, синхронизация будет заблокирована, а async не будет, однако есть дополнительные семантики, чтобы принять во внимание. Вызов dispatch_sync() также заставит ваш код дождаться завершения каждого ожидающего элемента в этой очереди, что также сделает его точкой синхронизации для указанной работы. dispatch_async() просто отправит работу в очередь и сразу же вернется, после чего она будет выполнена «в какой-то момент», и вам нужно будет отслеживать завершение этой работы каким-либо другим способом (обычно путем вложенности одного dispatch_async внутри другого dispatch_async - см. например, справочная страница).

+0

благодарим за ответ. теперь он делает больше смысла. –

6

От человека странице:

FUNDAMENTALS

Conceptually, dispatch_sync() is a convenient wrapper around 
dispatch_async() with the addition of a semaphore to wait for completion 
of the block, and a wrapper around the block to signal its completion. 
See dispatch_semaphore_create(3) for more information about dispatch sem- 
aphores. The actual implementation of the dispatch_sync() function may be 
optimized and differ from the above description. 
1

Задачи могут выполняться синхронно или асинхронно.

Функция синхронного возвращает управление в текущей очереди только после завершения задачи. Он блокирует очередь и ждет, пока задача не будет завершена.

Асинхронный Функция возвращает управление текущей очередью сразу после того, как задача была отправлена ​​для выполнения в другой очереди. Он не дожидается завершения задания. Он не блокирует очередь.

Только в асинхронных мы можем добавить задержки ->asyncAfter(deadline: 10..