Обнаружьте ошибки в функции загрузки изображений

Нужно исправить конкурентное изменение массива, порядок результатов, обработку HTTP-ошибок и управление жизнью запросов. Сильный self не означает автоматически постоянную утечку.

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

Что ответить на собеседовании

Нужно исправить конкурентное изменение массива, порядок результатов, обработку HTTP-ошибок и управление жизнью запросов. Сильный self не означает автоматически постоянную утечку.

Подробный разбор

Ответ с пояснениями

Условие

В этом фрагменте Swift‑кода реализуется загрузка изображений из сети, однако в нём присутствуют несколько проблем, которые могут привести к утечкам памяти, неправильному порядку обновления UI и другим багам. Проанализируйте код и укажите все недочёты.

private func loadImage(){
    stories.forEach{ storyItem in
        if let bgUrl = URL(string: storyItem) {
            URLSession.shared.dataTask(with: bgUrl){ (data,_,_) in
                guard let imageData = data, let image = UIImage(data: imageData) else {return}
                self.storyImages.append(image)
            }.resume()
        }
    }
}

Ответ

Нужно исправить конкурентное изменение массива, порядок результатов, обработку HTTP-ошибок и управление жизнью запросов. Сильный self не означает автоматически постоянную утечку.

Completion URLSession может работать вне main queue, поэтому storyImages.append небезопасен при параллельных ответах и особенно как источник UI. Ответы приходят не в порядке stories: храните индекс каждого запроса и собирайте результат по слотам. Проверяйте error и HTTP status, задайте лимит параллелизма и размера изображений, отменяйте устаревшие задачи. Повторный loadImage не должен смешивать разные поколения результатов. Захват self может удерживать экран до завершения, поэтому политика weak/отмены выбирается по контракту. Ошибки и завершение всей партии должны быть явно представлены.

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

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

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

Подробнее