Эффективная загрузка изображений в таблицы/коллекции зависит от асинхронного скачивания, кеширования и управления переиспользованием ячеек, чтобы избежать зависаний UI и неправильного отображения изображений.
cellForRowAt, чтобы только видимые ячейки запрашивали изображенияТак как ячейки переиспользуются, медленная загрузка может завершиться после того, как ячейка была переназначена новым данным. Всегда проверяй перед обновлением UI:
let indexPath = indexPath
URLSession.shared.dataTask(with: url) { data, _, _ in
guard let data = data else { return }
DispatchQueue.main.async {
guard tableView.indexPath(for: cell) == indexPath else { return }
cell.imageView?.image = UIImage(data: data)
}
}.resume()
Использование библиотеки вроде Kingfisher или SDWebImage — это предпочтительное решение для продакшена. Они автоматически обрабатывают асинхронную загрузку, кеширование, placeholder-изображения и валидацию переиспользования ячеек:
cell.imageView?.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"))
Загрузка изображений должна быть запущена на главном потоке внутри cellForRowAt, чтобы UI немедленно обновился при получении изображений.
Новый — ещё не проверен сообществом
Вы