Search
Write a publication
Pull to refresh

Ускорение UITableView в iPhone

Reading time3 min
Views4.3K
В одном разрабатываемом приложении я использовал UITableView для отображения информации. И здесь я расскажу какие способы были придуманы для ускорения работы этого элемента.

image

Список жанров это и есть UITableView.
UITableView состоит из ячеек UITableViewCell. Можно сообщать сколько в списке будет ячеек, высоту каждой ячейки, делить их на секции. Когда ячейку нужно показать вызывается функция:
— (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
Механизм работы такой, что если ячейка скрылась за экран, то при последующем показе приложение вновь запросит ячейку.

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

В моем приложении на одну ячейку приходилось около 10 различных элементов(UILabel,UITextView,UIImageView). Одновременно на экране отображалось около 5 таких ячеек. Были дикие тормоза при прокрутке. И вот после долгих эксперементов у меня набрался целый список возможных ускорений прокрутки таких тяжелых списков. Представлено в порядке хронологии и их скорости.

1) — (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier
Эта фукнция позволяет сэкономить время на создании ячейки из NIB файлов, она возвращает уже созданую ячейку, но вам всеравно придется поменять ее содержимое на актуальное, а это время.
Это метод который советуют сами Apple. Он часто встречается в их примерах.
Минусы:
-требуется время на замену содержмиого ячейки
Плюсы:
-экономия памяти

2) Предварительное создание всех ячеек и хранение их в NSArray или NSMutableArray.
В данном случае ячейка создается один раз, и сохраняется в массиве. Каждый раз когда ячейка запрашивается нам всего лишь нужно достать ее из массива по индексу. Как вариант можно не создавать все ячейки разом, а только тогда когда запрашиваются, и затем сохранять в массив. В обоих случаях ячейка будет создана только один раз.
Этот метод пришлось использовать изза наличия анимации в ячейках.
Минусы:
-требуется память на все ячейки
-возможно подвисание пока создаются все ячейки разом
Плюсы:
-скорость отдачи, время тратится только на доступ к элементу массива

3) UIScrollView
Этот вариант подразумевает вместо UITableView использовать UIScrollView, тоесть UIView котоырй можно скролить. Создаем все ячейки, размещаем их как subView в нашем UIScrollView, задаем размеры прокрутки.Готово.
Этот метод использовался помучто Метод 2 не устраивал по скорости прокрутки.
Минусы:
-требуется память на все ячейки
-быстро работал только до высоты 1500 пикселей
-сложность в реализации взаимодествия с пользователем
Плюсы:
-более быстрая прокрутка

И вот когда наша команда совсем отчаилась, вспомнили про еще один вариант который и стал использоваться.

4) Скриншоты ячеек.

Суть заключается в том что сделать с ячеек скриншоты. Тормоза очевидно вызывались большим количеством subView(элементов ячейки). Ну тогда давайте сделаем вместо 10 subView, 1 который содержит в себе графическое представление всех десяти.

MyCell это оригинальная, уже заполненая нужным контентом ячейка
UIGraphicsBeginImageContext(((UIView*)MyCell.frame.size);
[((UIView*)MyCell.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Сохраненную в image картинку можно добавить в ячейку с одним единственным UIImageView.
Получился ну очень быстрый список с ячейками.
Минусы:
-требуется время на создание
-требуется как минимум в 2 раза больше памяти на хранение ячеек и их скриншотов
Плюсы:
-самая быстрая прокрутка

UPD:
Люди говорят что если использовать первый метод то все нормально рисуется, к сожалению не могу использвоать этот метод так как у меня используется:
-3 вида различных ячеек
-имеется анимация на ячейках

Посчитал сейчас количество элементов в ячейках, насчитал по 22 на ячейку
Tags:
Hubs:
Total votes 23: ↑13 and ↓10+3
Comments22

Articles