Обычный цикл не ждёт асинхронную сеть. Для последовательной загрузки нужен async-метод с await на каждой итерации либо цепочка completion-вызовов.
Функция массовой загрузки изображений
Обычный цикл не ждёт асинхронную сеть. Для последовательной загрузки нужен async-метод с await на каждой итерации либо цепочка completion-вызовов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, позволяющую последовательно загрузить набор изображений. Пример использования: цикл, который вызывается сто раз, передавая текущий индекс в функцию загрузки. После завершения всех запросов вывести сообщение "Done".
import Foundation
for idx in 0..<100 {
fetchImage(at: idx)
}
print("Done")
func fetchImage(at idx: Int) {
// Запрос на получение изображения
}
Ответ
Обычный цикл не ждёт асинхронную сеть. Для последовательной загрузки нужен async-метод с await на каждой итерации либо цепочка completion-вызовов.
Вариант с явным поставщиком URL:
import Foundation
func fetchAll(urlForIndex: (Int) -> URL) async throws {
for idx in 0..<100 {
let (_, response) = try await URLSession.shared.data(
from: urlForIndex(idx))
guard let http = response as? HTTPURLResponse,
(200..<300).contains(http.statusCode) else {
throw URLError(.badServerResponse)
}
}
print("Done")
}
Следующий запрос начинается после завершения предыдущего; Done выводится только при успехе всех ста запросов. Здесь данные намеренно не сохраняются — добавьте декодирование/хранение под нужный контракт. При ошибке выполнение останавливается и передаёт её вызывающему коду; если требуется обработать все ошибки, собирайте результаты отдельно.