Трюки для улучшения производительности прокрутки iPhone UITableView?

У меня есть uitableview, который загружает довольно большие изображения в каждую ячейку, а высота ячеек зависит от размера изображения. Производительность прокрутки является достойной, но иногда может быть отрывистой.

Я нашел эти советы, которые я нашел в блоге FieryRobot:

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

Есть ли у кого-нибудь советы по улучшению производительности прокрутки uitableview?

Ответ 1

  • Загрузите высоту строк (представление таблицы может запрашивать это часто)
  • Создайте менее используемый кэш для изображений, используемых в таблице (и аннулируйте все неактивные записи при получении предупреждения о памяти)
  • Если возможно, все UITableViewCell drawRect: вычеркивайте, если это возможно, во избежание подсмотров любой ценой (или если вам нужна стандартная функциональность доступности, представление содержимого drawRect:)
  • Сделайте ваш слой UITableViewCell непрозрачным (то же самое для представления содержимого, если он у вас есть)
  • Используйте функциональность reusableCellIdentifier, как рекомендовано UITableView examples/documentation
  • Избегайте градиентов/сложных графических эффектов, которые не предварительно запекаются в UIImage s

Ответ 2

  • Если вы являетесь подклассом UITableViewCell, не используйте нить, вместо этого напишите его в коде. Это много быстрее, чем загрузка файлов Nib.
  • Если вы используете изображения, убедитесь, что вы их кешируете, чтобы не приходится загружать из файла больше, чем один раз для каждого (если у вас есть памяти - вы будете удивлены, как много космических снимков).
  • Сделайте столько элементов непрозрачными, как возможное. Аналогичным образом, попробуйте не использовать и использовать изображения с прозрачностью.

Ответ 3

Разработчик за Tweetie много писал об этом и имеет код, который демонстрирует, как это было сделано для этого приложения. В принципе, он защищает одно пользовательское представление на ячейку таблицы и рисует его вручную (а не подсайты с помощью Interface Builder, среди других опций).

fast-scrolling-in-tweetie-with-uitableview

Кроме того, Apple обновила собственный образец кода для TableView в своих обучающих программах TableViewSuite (возможно, в ответ на это?)

TableViewSuite

Ответ 4

# 1 убийца производительности для прокрутки UITableView рисует тени на любом уровне представления ячеек, поэтому, если прокрутка производительности имеет значение, тогда не делайте тени, если в основном это не замедляет ваш основной поток.

подумал, что это нужно было сказать, поскольку ни один из принятых ответов не упоминал о тенях и слоях. +)

Ответ 5

Любая проблема с производительностью прокрутки UITableView может быть решена с использованием техник, которые уже описаны в других ответах. Однако много раз вялая производительность вызвана чем-то по своей сути ошибочным или повторяющимся.

Тот факт, что UITableView повторно использует ячейки, и тот факт, что каждая ячейка может нуждаться в собственном изображении - вместе делает бит решения сложным. Из того, как он решается в общем, здесь я резюмирую то, о чем следует позаботиться:

  • Загрузка данных в источник данных - из REST/database. Этот шаг должен выполняться на фоне, в конечном итоге используя dispatch_async вместе с очередью GCD.
  • Создание и инициализация соответствующих объектов модели данных и их размещение внутри массива
  • [tableView reloaddata]
  • Внутри cellForRowAtIndexPath включить код, который будет устанавливать данные (текст) из правильного объекта модели данных массива.
  • Теперь изображения могут быть также в виде URL-адреса, поэтому этот шаг может быть немного причудливым из-за повторного использования ячейки, выполняемого с помощью табличного представления. Сердце факта состоит в том, чтобы снова загрузить изображение из кэша устройства/URL-адреса с помощью async-очереди, а затем установить его для исправления cell.image(независимо от свойства вашей ячейки).

Чтобы избежать проблем, обратитесь к этому руководству о ленивой загрузке изображений в виде таблицы.