Статьи

Работа с DispatchGroup в Swift

При работе с сетевыми запросами зачастую возникает следущий кейс: программе нужно выполнить сразу несколько запросов и дождаться завершения каждого из них прежде, чем переходить к следующему этапу. Самый удобный инструмент для этого — DispatchGroup.
Основные методы для работы с DispatchGroup:

  • .enter — вход в группу;
  • .leave — выход из группы;
  • .notify(queue: DispatchQueue) — оповещение о завершении работы группы.
Пример 1

Рассмотрим первый пример, в котором нам необходимо дождаться завершения работы трёх методов.
Рассмотрим работу кода построчно:

  • 3–19: объявление методов. Искусственно делаем так, чтобы ответ от запросов мы ждали 2, 4 и 6 секунд;
  • 21: объявление группы;
  • 23: вход в группу. Теперь группа будет ожидать, пока её счетчик не обнулится, и только тогда будет вызван group.notify;
  • 26: получение ответа от метода request1 и выход из группы;
  • 41: вызов group.notify будет осуществлен только тогда, когда её счетчик обнулится. Иначе говоря, за каждым вызовом group.enter()должен последовать вызов group.notify().

В результате выполнения кода в консоль будет выведен следующий ответ:
Request 1 completed
Request 2 completed
Request 3 completed
All requests completed
Пример 2

В следующем примере мы рассмотрим работу с DispatchGroup в цикле:
Рассмотрим работу кода построчно:

  • 3: создание группы group;
  • 5–9: описание функции загрузки страницы. Имитируем длительную работу функции в течение трёх секунд;
  • 11–17: цикл вызова функции loadPage. Вход в группу осуществляется перед вызовом функции, а выход из группы — при получении ответа.
  • 19–21: оповещение о завершении всех процессов в группе.

В результате выполнения кода в консоль будет выведен следующий ответ:
Page 0 loaded
Page 1 loaded
Page 2 loaded
Page 3 loaded
Page 4 loaded
Page 5 loaded
All pages loaded
В этой статье мы рассмотрели работу с DispatchGroup. Если у вас остались вопросы — пишите в наш телеграм-чат. Всем пока!
Многопоточность