Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: dispatchgroup

Как выполнить несколько асинхронных задач и получить результат после завершения всех?

Вопрос проверяет умение координировать параллельные операции и правильно собирать результаты без гонок и преждевременного завершения.

Короткий ответ

В GCD для этого используют DispatchGroup. Каждая задача “входит” в группу перед стартом и “выходит” после завершения. Когда все вышли, вызывается notify, где можно собрать результаты и обновить UI. В Swift Concurrency аналогом является async let или TaskGroup. Важно корректно управлять потокобезопасностью при записи результатов.

Длинный ответ

Задача “подождать несколько асинхронных операций” встречается постоянно: загрузить несколько ресурсов, выполнить пачку запросов, собрать данные для экрана.

Вариант 1: DispatchGroup (GCD)

Базовый сценарий

  1. Создаем группу

  2. Для каждой задачи делаем enter

  3. В completion делаем leave

  4. В notify получаем сигнал “все готово”

Пример:

let group = DispatchGroup()
var resultA: Data?
var resultB: Data?

group.enter()
loadA { data in
    resultA = data
    group.leave()
}

group.enter()
loadB { data in
    resultB = data
    group.leave()
}

group.notify(queue: .main) {
    // здесь гарантированно завершены A и B
    // можно собрать результаты
}

Важный момент про потокобезопасность

Если результаты пишутся с разных потоков, стоит:

  • писать результаты на serial queue

  • или синхронизировать доступ (например, через barrier/serial queue)

Вариант 2: Swift Concurrency

async let

Подходит, когда есть фиксированное число задач.

async let a = fetchA()
async let b = fetchB()

let (ra, rb) = await (a, b)
// здесь обе завершены

withTaskGroup

Подходит, когда задач много и их число динамическое.

  • можно добавлять задачи в цикле

  • собирать результаты по мере завершения

Как выбрать подход

  • Проект на GCD/старый код: DispatchGroup

  • Современный код: async let / TaskGroup

  • Нужны отмена и structured concurrency: предпочитать Swift Concurrency

Вывод

Чтобы дождаться завершения нескольких асинхронных операций, нужен координирующий механизм: в GCD это DispatchGroup, в Swift Concurrency — async let и TaskGroup. Ключевые ошибки в таких задачах — забыть leave, обновить UI не на main, или получить гонку данных при записи результатов. Правильная координация делает код предсказуемым, ускоряет загрузку за счет параллелизма и упрощает поддержку.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • IOS

    IOS

Ключевые слова

#dispatchgroup

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.