Какие действия предпринять для оптимизации производительности таблицы в iOS приложении
Что проверяют
Понимаете ли вы, откуда берутся подтормаживания при прокрутке: всё, что делается в cellForRowAt и на главном потоке, отнимает время у кадра. Следом обычно спрашивают, как вы найдёте причину лагов, то есть про Instruments.
Как отвечать
Бюджет кадра при 60 Гц около 16 мс, на экранах ProMotion со 120 Гц около 8 мс. Всё, что не укладывается, превращается в пропущенные кадры (hitches). Отсюда меры:
- переиспользование ячеек:
dequeueReusableCell(withIdentifier:for:)и сброс состояния вprepareForReuse(), чтобы в ячейке не мелькала старая картинка; - лёгкий
cellForRowAt: только конфигурация готовыми данными. Форматирование дат, парсинг и сборка атрибутированных строк делаются заранее во view model и кэшируются; - изображения: загрузка и декодирование вне главного потока, уменьшение до размера ячейки (downsampling через ImageIO или
prepareThumbnailс iOS 15), кэш и отмена загрузки для ушедших с экрана ячеек. Готовые решения: Kingfisher, SDWebImage, Nuke; - prefetching:
UITableViewDataSourcePrefetchingначинает загрузку до того, как строка появится; - высоты: Auto Layout с
automaticDimensionи разумныйestimatedRowHeight, а для сложной вёрстки посчитанная вручную и закэшированная высота; - отрисовка: без лишней прозрачности, без offscreen-рендеринга от
cornerRadiusвместе сmasksToBoundsи без теней безshadowPath; - обновления:
UITableViewDiffableDataSourceи точечныйreconfigureItemsвместоreloadData(); - пагинация: данные подгружаются порциями, а не весь список сразу.
Диагностика: Instruments с шаблонами Time Profiler и Animation Hitches, подсветка offscreen-рендеринга в симуляторе.
Где спотыкаются
Обновляют таблицу из фонового потока после загрузки данных. UIKit работает только на главном потоке, и итог непредсказуем: от артефактов до падения. Такое ловит Main Thread Checker.
Грузят картинки через Data(contentsOf:) прямо в cellForRowAt или забывают, что после асинхронной загрузки ячейка уже может показывать другую строку.
Считают, что diffable data source сам ускоряет прокрутку. Он делает обновления корректными и анимированными, но тяжёлую ячейку не облегчит.