Что такое dispatch_group и зачем он нужен
Что проверяют
Умеете ли вы дождаться нескольких асинхронных операций и не заблокировать при этом главный поток. Следом обычно просят объяснить разницу между notify и wait или переписать то же на Swift Concurrency.
Как отвечать
dispatch_group в Swift называется DispatchGroup. Это счётчик незавершённых задач из GCD: пока он больше нуля, группа занята, когда падает до нуля, срабатывают подписанные обработчики. Типичная задача: параллельно загрузить профиль, настройки и заказы, а экран показать, когда пришло всё.
Как задачи попадают в группу:
queue.async(group:): блок учитывается автоматически, но только пока выполняется синхронно. Сетевой запрос с колбэком внутри группа не ждёт;enter()иleave(): ручной учёт для асинхронных API.enter()до старта операции,leave()на каждом пути завершения, включая ошибку. Удобно ставитьdefer { group.leave() }первой строкой колбэка.
Как дождаться:
notify(queue:execute:): выполнит блок на указанной очереди, поток не блокируется. Это основной вариант;wait(timeout:): блокирует текущий поток и возвращает.successили.timedOut. Допустим только на фоновом потоке.
Группа не собирает ни результаты, ни ошибки. Их складывают в общее хранилище под последовательной очередью или блокировкой, потому что колбэки приходят из разных потоков. Отменить задачи группа тоже не умеет.
В новом коде ту же задачу решают async let для фиксированного числа операций и withTaskGroup или withThrowingTaskGroup для динамического: результаты и ошибки возвращаются естественно, отмена доходит до дочерних задач. DispatchGroup остаётся в старом коде и колбэчных SDK, поэтому знать его нужно.
Где спотыкаются
Забывают leave() в ветке с ошибкой. Счётчик не обнуляется, notify не срабатывает, экран вечно крутит загрузку. Лишний leave() ещё хуже: приложение падает на несбалансированном вызове.
Вызывают wait() на главном потоке. Интерфейс замирает, а если колбэки задач сами приходят на главную очередь, получается дедлок.
Используют async(group:) для асинхронной работы и удивляются, что notify срабатывает раньше, чем пришли ответы сети.