Grand Central Dispatch: Как мне дождаться завершения очереди блоков? - PullRequest
3 голосов
/ 20 февраля 2012

В iOS у меня есть приложение, в котором мне нужно дождаться завершения текущих блоков в очереди GCD.У меня сложилось впечатление, что эта строка кода сделает именно это:

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{});

Я получил этот совет здесь:

http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/

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

Спасибо,
Дуг

1 Ответ

5 голосов
/ 20 февраля 2012

Трюк dispatch_sync() будет работать только для последовательных очередей, что показано в этом руководстве.dispatch_get_global_queue() возвращает параллельную очередь, см. это примечание к документации :

Блоки, отправленные в эти глобальные параллельные очереди, могут выполняться одновременно по отношению друг к другу.

Чтобы справиться с глобальной параллельной очередью, вы должны использовать группу, в которую вы отправляете свои блоки, также упомянутые в этом руководстве, и ждать, пока вся группа наберет dispatch_group_wait().

...