Выбор ответа Middle GCD и OperationQueue спрашивают часто обновлено

Как дождаться нескольких запросов в GCD

Вопрос

Как выполнить код после завершения трёх асинхронных запросов на callback-API, не блокируя главный поток?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: DispatchGroup: enter/leave на запрос и notify(queue: .main). notify выполнит блок, когда счётчик группы вернётся к нулю, и не блокирует поток. wait() на главном потоке заморозит интерфейс. main.sync из главного потока это deadlock.

Варианты ответа

  1. DispatchGroup и group.wait() на главном потоке после запуска запросов
  2. Поставить три запроса в DispatchQueue.main.sync по очереди
  3. DispatchGroup: enter/leave на запрос и notify(queue: .main)правильный ответ
  4. DispatchSemaphore(value: 3) и три signal() в completion

Разбор

notify выполнит блок, когда счётчик группы вернётся к нулю, и не блокирует поток. wait() на главном потоке заморозит интерфейс. main.sync из главного потока это deadlock. Семафор ограничивает число одновременных доступов, а не ждёт завершения набора задач. Важно: leave() вызывается на всех путях, включая ошибки, иначе notify не наступит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме