Можно ли в одном потоке использовать несколько DispatchGroup в Swift?

«Можно ли в одном потоке использовать несколько DispatchGroup в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Экземпляры DispatchGroup независимы и предназначены для отслеживания выполнения разных наборов асинхронных задач.

Пример использования нескольких групп:

let imageDownloadGroup = DispatchGroup()
let dataProcessingGroup = DispatchGroup()

// Задача в первой группе
imageDownloadGroup.enter()
downloadImage { image in
    // Обработка изображения
    imageDownloadGroup.leave()
}

// Задача во второй группе
dataProcessingGroup.enter()
processData { result in
    // Обработка данных
    dataProcessingGroup.leave()
}

// Ожидание завершения каждой группы
imageDownloadGroup.notify(queue: .main) {
    print("Все изображения загружены")
}

dataProcessingGroup.notify(queue: .main) {
    print("Вся обработка данных завершена")
}

Преимущества:

  • Разделение ответственности. Позволяет независимо управлять разными этапами работы (например, загрузка и обработка).
  • Гибкость. Можно комбинировать wait() и notify() для разных групп, создавая сложные сценарии синхронизации.
  • Потокобезопасность. DispatchGroup сам по себе потокобезопасен, его можно использовать из любого потока.