Вопрос проверяет понимание race condition и связи асинхронных операций с жизненным циклом UI.
Асинхронная загрузка не знает, актуальна ли ячейка в момент завершения запроса. Пока изображение загружается, ячейка может быть переиспользована для других данных. Если результат загрузки без проверки устанавливается в UI, возникает подмена изображения. Это классическая race condition. Без дополнительной логики проблема неизбежна.
Асинхронная загрузка работает независимо от жизненного цикла UI, и именно это создает сложности.
Типичный сценарий выглядит так:
Ячейка конфигурируется с моделью A
Запускается асинхронная загрузка изображения A
Ячейка переиспользуется для модели B
Запрос A завершается
Изображение A устанавливается в ячейку B
С точки зрения кода ошибки нет, но логически данные уже устарели.
UIKit не знает:
Какая модель сейчас привязана к ячейке
Какой запрос является актуальным
Какой результат считать валидным
Вся ответственность лежит на разработчике.
Неправильные изображения
Мерцание при скролле
Нестабильный UI
Асинхронная загрузка всегда должна быть связана с текущим состоянием ячейки или модели. Без этой связи переиспользование неизбежно приведет к визуальным ошибкам.