Вопрос проверяет знание инструментов GCD для синхрониции нескольких задач и ограничения параллелизма.
DispatchGroup позволяет группировать несколько асинхронных задач и получать уведомление, когда все они завершатся. DispatchSemaphore контролирует доступ к ресурсам, уменьшая либо увеличивая счётчик и блокируя поток при нулевом значении до сигнала.
DispatchGroup:
Создаёт группу:
let group = DispatchGroup()Помечает начало и конец задачи:
group.enter()
queue.async {
// работа
group.leave()
}Ожидает окончания:
group.notify(queue: .main) { print("Готово") }DispatchSemaphore:
Инициализация с начальным счётчиком:
let sem = DispatchSemaphore(value: 2)Перед выполнением ресурсоёмкой задачи — wait(), после — signal():
sem.wait()
// работа
sem.signal()Ограничивает число одновременных задач.
Когда применять:
DispatchGroup — чтобы дождаться набора параллельных задач.
DispatchSemaphore — чтобы ограничить параллелизм (например, пул соединений).
Вывод:
Эти инструменты дают контроль за порядком выполнения и количеством одновременных операций, что важно для безопасной работы с ресурсами.