Трюки для улучшения производительности прокрутки 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(независимо от свойства вашей ячейки).
Чтобы избежать проблем, обратитесь к этому руководству о ленивой загрузке изображений в виде таблицы.