Grand Central Диспетчер асинхронный против синхронизации - PullRequest
28 голосов
/ 09 февраля 2012

Я читаю документы об очередях отправки для GCD, и в них говорится, что очереди FIFO, поэтому я удивляюсь, как это влияет на асинхронные / синхронизирующие отправки?выполняет вещи в том порядке, в каком он получает, в то время как синхронизация выполняет их последовательно.

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

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

Ответы [ 5 ]

32 голосов
/ 09 февраля 2012

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

19 голосов
/ 09 февраля 2012

sync означает, что функция БЛОКИРОВАЕТ текущий поток до его завершения, async означает, что он будет обрабатываться в фоновом режиме, а функция НЕ БЛОКИРОВАЕТ текущий поток.создание очереди последовательной отправки

8 голосов
/ 17 февраля 2012

Со страницы руководства:

ОСНОВЫ

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.
5 голосов
/ 04 декабря 2017

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

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

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

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

1 голос
/ 07 марта 2019

С помощью GCD вы можете отправить задачу либо synchronously, либо asynchronously.

Функция synchronous возвращает управление вызывающей стороне после ее завершения.Можно запланировать единицу работы синхронно, вызвав DispatchQueue.sync(execute:).

. Функция asynchronous немедленно возвращается, приказывая запустить задачу, но не ожидая ее завершения.Таким образом, асинхронная функция не блокирует текущий поток выполнения от перехода к следующей функции.Вы можете планировать единицу работы асинхронно, вызывая DispatchQueue.async(execute:).

Подробнее здесь

...