Как дождаться нескольких запросов в GCD
Вопрос
Как выполнить код после завершения трёх асинхронных запросов на callback-API, не блокируя главный поток?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
DispatchGroupиgroup.wait()на главном потоке после запуска запросов- Поставить три запроса в
DispatchQueue.main.syncпо очереди DispatchGroup:enter/leaveна запрос иnotify(queue: .main)правильный ответDispatchSemaphore(value: 3)и триsignal()в completion
Разбор
notify выполнит блок, когда счётчик группы вернётся к нулю, и не блокирует поток. wait() на главном потоке заморозит интерфейс. main.sync из главного потока это deadlock. Семафор ограничивает число одновременных доступов, а не ждёт завершения набора задач. Важно: leave() вызывается на всех путях, включая ошибки, иначе notify не наступит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
DispatchWorkItem и отмена
Следующий вопрос
Задача на Swift: операции с зависимостями и критический путь
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- Задача на Swift: OperationQueue с ограничением параллельности
- DispatchQueue.main.sync на главном потоке
- Инструменты GCD и их задачи
- Синхронный доступ к состоянию без очереди