Grand Central Dispatch async vs sync

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

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

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

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

+28
источник поделиться
5 ответов

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

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

+19
источник

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

+31
источник

На странице man:

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.
+8
источник

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

Функция

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

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

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

+5
источник

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

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

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

Узнайте больше здесь

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос