Нужно исправить конкурентное изменение массива, порядок результатов, обработку 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/отмены выбирается по контракту. Ошибки и завершение всей партии должны быть явно представлены.