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


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

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

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

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

5 88

5 ответов:

  1. кэшировать высоту строк (табличное представление может запрашивать это часто)
  2. создать наименее недавно используемый кэш для изображений, используемых в таблице (и аннулировать все неактивные записи при получении предупреждения памяти)
  3. нарисуйте все в UITableViewCell ' s drawRect: если возможно, избегайте вложенных представлений любой ценой (или если вам требуется стандартная функциональность доступности, представление содержимого drawRect:)
  4. сделать свой UITableViewCellслой непрозрачный (такой же идет для просмотра содержимого, если у вас есть один)
  5. используйте функцию reusableCellIdentifier в соответствии с рекомендациями UITableView примеры/документация
  6. избегайте градиентов/сложных графических эффектов, которые не предварительно запеченные в UIImages
  1. Если вы подклассы UITableViewCell, Не используйте перо, писать его в код. Это очень много быстрее, чем загрузка файлов ниб.
  2. Если вы используете изображения, убедитесь, что вы кэшируете их, так что вы не делаете придется загрузить из файла больше, чем один раз для каждого (если у вас есть память-вы будете удивлены, как много космических снимков занимают).
  3. сделать столько элементов непрозрачными, сколько вероятный. Точно так же старайтесь не использовать изображения с прозрачностью.

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

быстрая прокрутка-в-tweetie-с-uitableview

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

TableViewSuite

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

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

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

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

  1. загрузить данные в источник данных-из REST / базы данных. Этот шаг должен быть выполнен в фоновом режиме, в конечном итоге с помощью dispatch_async вместе с очередью GCD.
  2. создать и инициализировать соответствующие объекты модели данных и поместить их в массив
  3. [tableView reloaddata]
  4. внутри cellForRowAtIndexPath, включить код, который будет устанавливать данные (текст) из правильного объекта модели данных массива.
  5. теперь изображения, возможно, в виде URL тоже, так что этот шаг может будьте немного изворотливы из-за повторного использования ячеек, выполненного табличным представлением. Суть в том, чтобы снова загрузить изображение из кэша устройства / URL с помощью асинхронной очереди, а затем установить его в правильную ячейку.изображение (независимо от того, что является вашим свойством изображения ячейки).

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