Плавный скролл длинного списка в UIKit
Вопрос
Лента в UICollectionView дёргается на скролле. Как вы найдёте и устраните причину?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Измерить: Instruments (Time Profiler, Animation Hitches), понять, главный поток или рендеринг
Главный поток: никакой синхронной работы в конфигурации ячейки, декодирование картинок в фоне
Картинки уменьшать до размера ячейки (downsampling), кеш в памяти
Рендеринг: `shadowPath`, без лишних масок и прозрачности, растеризация осторожно
Prefetching (`prefetchDataSource`), расчёт высот заранее, diffable с `reconfigureItems`
Что могут спросить следом
- Почему декодирование JPEG на главном потоке опасно?
- Как работает prefetching и когда его отменять?
Разбор
Сначала измеряю, а не угадываю: Instruments с шаблоном Animation Hitches и Time Profiler покажут, где теряется время: на главном потоке (commit) или при рендеринге. Если это главный поток, ищу синхронную работу в конфигурации ячейки: форматирование дат через новый DateFormatter, парсинг, синхронное чтение файлов, декодирование картинок. Картинки декодирую и уменьшаю до размера ячейки в фоне через ImageIO, держу их в NSCache. Включаю prefetching, чтобы начинать загрузку заранее, и отменяю её для ушедших за экран индексов. Если проблема в рендеринге, задаю shadowPath, убираю лишние маски и полупрозрачность. Обновления делаю снимками diffable data source с reconfigureItems, без reloadData. В конце повторяю замер на старом устройстве, а не на симуляторе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «UIKit»
- Неверная картинка в переиспользуемой ячейке
- Diffable data source и повторяющиеся идентификаторы
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Разница между frame и bounds
- Где брать финальный размер view
- Почему кнопка не получает нажатия