Трюки для повышения производительности прокрутки iPhone UITableView?
У меня есть uitableview, который загружает довольно большие изображения в каждую ячейку, а высота ячейки варьируется в зависимости от размера изображения. Производительность прокрутки приличная, но иногда может быть прерывистой.
Я нашел эти советы в блоге FieryRobot:
стекловидный прокрутки-с-UITableView
более-стекловидный прокрутки-с-UITableView
У кого-нибудь есть советы по улучшению производительности прокрутки в uitableview?
5 ответов
- Кэшируйте высоту строк (табличное представление может запрашивать это часто)
- Создайте кэш с наименьшим количеством использованных изображений для таблицы, используемой в таблице (и сделайте недействительными все неактивные записи, когда вы получите предупреждение о памяти)
- Нарисуй все в
UITableViewCell
"sdrawRect:
по возможности избегайте подпредставлений любой ценой (или, если вам требуется стандартная функциональность доступности, представление контентаdrawRect:
) - Сделай свой
UITableViewCell
непрозрачный слой (то же самое относится и к просмотру контента, если он у вас есть) - Используйте функцию reusableCellIdentifier в соответствии с рекомендациями
UITableView
примеры / документация - Избегайте градиентов / сложных графических эффектов, которые предварительно не запекаются в
UIImage
s
- Если вы подкласс
UITableViewCell
, не используйте Nib, вместо этого запишите его в коде. Это намного быстрее, чем загрузка файлов Nib. - Если вы используете изображения, убедитесь, что вы их кэшируете, чтобы вам не приходилось загружать из файла более одного раза для каждого (если у вас есть память - вы будете удивлены, сколько места занимают изображения).
- Сделайте как можно больше элементов непрозрачными. Точно так же, старайтесь не использовать изображения с прозрачностью.
Разработчик Tweetie много писал об этом и имеет некоторый код, который демонстрирует, как это было сделано для этого приложения. По сути, он / она защищает одно настраиваемое представление для каждой ячейки таблицы и рисует его вручную (вместо других подпрограмм в Интерфейсном Разработчике, среди других вариантов).
быстрая прокрутка-в-Tweetie-с-UITableView
Кроме того, Apple обновила свой собственный пример кода для TableView в своих руководствах TableViewSuite (может быть, в ответ на это?)
Убийца производительности № 1 для прокрутки UITableView - рисование теней на любом слое представления ячеек, поэтому, если производительность прокрутки имеет значение, не делайте тени, если в основном это не замедляет ваш основной поток.
Я подумал, что это должно быть сказано, так как ни один из принятых ответов не упомянул о тенях и слоях.:+)
Любая проблема с UITableView
производительность прокрутки может быть решена с использованием методов, уже описанных в других ответах. Однако во многих случаях вялое исполнение вызвано чем-то ошибочным или повторяющимся.
Дело в том, что UITableView
повторное использование ячеек, и тот факт, что каждая ячейка может нуждаться в собственном изображении - вместе делает решение немного сложным. Из того, как это решается в общем виде, здесь я суммирую вещи, о которых нужно позаботиться:
- Загрузка данных в источник данных - из REST / базы данных. Этот шаг должен быть выполнен в фоновом режиме, в конечном итоге используя dispatch_async вместе с GCD-очередью.
- Создать и инициализировать соответствующие объекты модели данных и поместить их в массив
[tableView reloaddata]
- внутри
cellForRowAtIndexPath
, включите код, который будет устанавливать данные (текст) из правильного объекта модели данных массива. - Теперь изображения также могут быть в форме URL, поэтому этот шаг может быть немного странным из-за повторного использования ячеек в табличном представлении. Суть в том, чтобы снова загрузить изображение из кэша / URL-адреса устройства с помощью асинхронной очереди, а затем установить для него правильное значение cell.image (независимо от того, какое у вас свойство изображения ячейки).
Чтобы избежать проблем, обратитесь к этому руководству о отложенной загрузке изображений в табличном представлении.