Этот блог переехал на 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. Если у вас остались вопросы — пишите в наш телеграм-чат. Всем пока!