Выполняются ли блоки, отправленные в диспетчерскую группу серийно или одновременно?

Диспетчерские группы - это функция GCD, позволяющая отправлять блоки, которые будут отправлены в определенные очереди. Что касается очередей, блоки отправляются по типу очереди: если очередь является последовательной, блок будет выполняться последовательно по отношению к этой очереди; если очередь параллельна, то это происходит, но одновременно.

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

+2
источник поделиться
1 ответ

Членство в группе отправки не зависит от исполнения заказа.

Группа отправки - это просто счетчик, dispatch_group_enter(group) увеличивает счетчик, а dispatch_group_leave(group) уменьшает счетчик.

dispatch_group_async(group, queue, block) - это ярлык для:

dispatch_group_enter(group);
dispatch_async(queue, ^{
    block();
    dispatch_group_leave(group);
});

т.е. порядок выполнения блоков, отправленных через dispatch_group_async(group, queue, block) зависит только от указанной queue (ей).

Когда счетчик группы отправки достигает нуля (группа становится пустым), все официанты в dispatch_group_wait(group) разбужаются, и все блоки, которые были отправлены группе через dispatch_group_notify(group, queue, block), все async'd их соответствующей queue (т.е. эти блоки могут выполняться одновременно, если указанная queue является параллельной/независимой).

+7
источник

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