Чем DispatchQueue.global() отличается от своей concurrent очереди?
Суть
DispatchQueue.global(qos:) — одна из системных concurrent-очередей (по одной на уровень QoS), общая для всего процесса: в неё же кладут работу фреймворки Apple и сторонние библиотеки. Своя очередь DispatchQueue(label:attributes: .concurrent) — приватный объект, которым управляете только вы.
Практические отличия:
- Barrier.
.barrierимеет смысл только на своей concurrent-очереди. На глобальной очереди флаг игнорируется (иначе один barrier останавливал бы всю систему) — блок выполнится как обычныйasync. - Изоляция. На своей очереди только ваши задачи, поэтому
sync/barrierдают предсказуемые гарантии и её можно использовать как reader-writer лок. - Управление. Свою очередь можно приостановить (
suspend/resume), задатьtargetочередь,autoreleaseFrequency, QoS по умолчанию; глобальную — нет. - Отладка.
labelсвоей очереди виден в Instruments и стеках крэшей. - Ресурсы. Своя очередь по умолчанию таргетится на глобальную того же QoS, то есть потоки берутся из того же пула — новых потоков она не создаёт.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep