Насколько дорогой UITableView reloadData? - PullRequest
5 голосов
/ 27 февраля 2009

Мне любопытно, насколько дорогостоящим в UITableView является reloadData? У меня есть приложение, которое будет делать примерно 10 последующих HTTP-запросов, и когда он получает данные / готовит, он перезагружает tableView. По мере того как набор данных становится все больше и больше, он становится очень вялым. Я пытаюсь выяснить, из-за того, сколько раз я перезагружаю tableView или из-за того, как я получаю / анализирую данные.

Какая лучшая практика в этом случае?

Ответы [ 5 ]

16 голосов
/ 14 августа 2010

Из UITableView.h:

 - (void)reloadData;                 // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks

"Это дешево."

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

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

5 голосов
/ 27 февраля 2009

Лучше всего, чтобы ваша реализация cellForRowAtIndexPath: выполняла как можно меньше работы. Фактически, он действительно не должен выполнять какую-либо работу, кроме заполнения экземпляра UITableViewCell данными, которые необходимо отобразить.

Вы должны использовать кэшированные UITableViewCell s, чтобы вам не приходилось каждый раз выделять новую ячейку. Если вы можете выполнить разбор и тому подобное в отдельном потоке и сделать проанализированные данные, готовые для представления, доступными для cellForRowAtIndexPath:, у вас не должно возникнуть проблем с производительностью.

Вы не сказали, используете ли вы пользовательский подкласс UITableViewCell, но если это так, иерархии глубокого просмотра также могут представлять проблему с производительностью, поскольку каждое представление в иерархии отображается. Чем полнее вы можете сделать UITableViewCell с, тем лучше.

Надеюсь, что вы движетесь в правильном направлении.

4 голосов
/ 27 февраля 2009

Лучше всего профилировать свое приложение, чтобы увидеть, где оно медленное.

Тем не менее, если ваши ячейки таблицы имеют одинаковую высоту, тогда я думаю

reloadData

нужно только позвонить

cellForRowAtIndexPath

для ячеек, которые видны на экране.

2 голосов
/ 21 февраля 2010

Расход перезагрузки табличного представления:

  1. Выяснить, сколько разделов и строк на разделы у вас есть
  2. получение высоты строк.

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

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

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

1 голос
/ 27 февраля 2009

Boot To The Head верный.

Я делаю последовательное обновление списка статей в Instapaper и вызываю -reloadData при каждой завершенной загрузке. Похоже на то, что вы делаете. Это не приводит к заметному снижению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...