Работа с DispatchGroup в Swift

EZE DEV
2 min readApr 19, 2021

Этот блог переехал на ezedev.ru, анонс тут.

Новые статьи на Medium больше публиковаться не будут.

При работе с сетевыми запросами зачастую возникает следущий кейс: программе нужно выполнить сразу несколько запросов и дождаться завершения каждого из них прежде, чем переходить к следующему этапу. Самый удобный инструмент для этого — 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 completedRequest 2 completedRequest 3 completedAll requests completed

Пример 2

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

Рассмотрим работу кода построчно:

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

В результате выполнения кода в консоль будет выведен следующий ответ:

Page 0 loadedPage 1 loadedPage 2 loadedPage 3 loadedPage 4 loadedPage 5 loadedAll pages loaded

В этой статье мы рассмотрели работу с DispatchGroup. Если у вас остались вопросы — пишите в наш телеграм-чат. Всем пока!

--

--