Функция массовой загрузки изображений

Обычный цикл не ждёт асинхронную сеть. Для последовательной загрузки нужен 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 выводится только при успехе всех ста запросов. Здесь данные намеренно не сохраняются — добавьте декодирование/хранение под нужный контракт. При ошибке выполнение останавливается и передаёт её вызывающему коду; если требуется обработать все ошибки, собирайте результаты отдельно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее