Grand Central Dispatch: как мне дождаться завершения очереди блоков?

В 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/

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

Спасибо,
Дуг


person dugla    schedule 19.02.2012    source источник


Ответы (1)


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

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

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

person Grzegorz Adam Hankiewicz    schedule 19.02.2012
comment
Бинго. Это действительно были проблемы. Переключение на последовательную очередь FIFO теперь работает. Большое спасибо, Гжегож. - person dugla; 20.02.2012
comment
Не работает, если вы уже находитесь в очереди, так как это приведет к тупику. - person OrangeDog; 18.12.2014