Неверная картинка в переиспользуемой ячейке
Вопрос
При быстром скролле в ячейках мелькают чужие аватары. Какая причина самая вероятная?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
UITableViewкеширует картинки между ячейками и подставляет их из кеша- Загрузка завершается, когда ячейка уже переиспользована для другой строкиправильный ответ
- Ячейки создаются заново на каждую строку, и картинки путаются
- Аватары грузятся на главном потоке и не успевают к показу своей строки
Разбор
Ячейки переиспользуются: та же ячейка через секунду показывает другую строку. Если загрузка запущена для строки 3, а закончилась, когда ячейка уже отображает строку 20, картинка окажется не там. Решение: в prepareForReuse сбрасывать картинку и отменять загрузку, а перед присваиванием проверять, что ячейка всё ещё ждёт тот же URL. Таблица картинки не кеширует, ячейки как раз не создаются заново. Загрузка на главном потоке дала бы подтормаживания, а не чужие картинки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «UIKit»
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Разница между frame и bounds
- Где брать финальный размер view
- Почему кнопка не получает нажатия
- Content hugging и compression resistance
- Задача на Swift: разница снимков для diffable data source