Этот вопрос проверяет умение управлять параллельными асинхронными задачами в iOS-разработке, используя DispatchGroup для синхронизации загрузки нескольких изображений.
В iOS-разработке часто возникает необходимость загрузить несколько изображений по разным URL и обработать их все вместе после завершения всех загрузок. DispatchGroup — это механизм GCD (Grand Central Dispatch), который позволяет синхронизировать выполнение группы задач.
DispatchGroup отслеживает количество "входов" и "выходов". Каждая асинхронная задача должна сообщить группе о своём начале (вызовом enter()) и завершении (вызовом leave()). Когда количество вызовов leave() сравняется с количеством enter(), группа считается завершённой.
Вот пример функции, которая загружает массив изображений:
func loadImages(from urls: [URL], completion: @escaping ([UIImage?]) -> Void) {
let group = DispatchGroup()
var images: [UIImage?] = Array(repeating: nil, count: urls.count)
for (index, url) in urls.enumerated() {
group.enter()
URLSession.shared.dataTask(with: url) { data, _, error in
defer { group.leave() } // Гарантирует вызов leave() даже при ошибке
if let data = data, error == nil {
images[index] = UIImage(data: data)
}
}.resume()
}
group.notify(queue: .main) {
completion(images)
}
}defer { group.leave() } внутри замыкания задачи, чтобы гарантировать, что группа получит уведомление о завершении даже при возникновении ошибки или раннем возврате.enumerated(), чтобы сохранить порядок изображений соответствующим URL.group.notify(queue: .main) устанавливает обработчик, который будет вызван на главной очереди после завершения всех задач — это удобно для обновления UI.Такой подход полезен в сценариях, где нужно загрузить несколько ресурсов перед отображением экрана (например, галерея изображений, аватары участников чата, миниатюры товаров). Он также может быть расширен для ограничения количества одновременных загрузок с помощью семафоров (DispatchSemaphore).
Вывод: Используйте DispatchGroup, когда вам нужно синхронизировать несколько независимых асинхронных операций и выполнить действие после их полного завершения, особенно в UI-контексте, где требуется обновить интерфейс после загрузки всех данных.
Уровень
Рейтинг:
3
Сложность:
4
Навыки
JavaScript
Swift
Ключевые слова
Подпишись на iOS Developer в телеграм