Ответ вслух Senior UIKit обновлено

Плавный скролл длинного списка в UIKit

Вопрос

Лента в UICollectionView дёргается на скролле. Как вы найдёте и устраните причину?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала измеряю, а не угадываю: Instruments с шаблоном Animation Hitches и Time Profiler покажут, где теряется время: на главном потоке (commit) или при рендеринге.

Что должно прозвучать в ответе

  • Измерить: 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 ошибок.