Насколько дорого стоит reloadData UITableView?

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

Что лучше всего в этом случае?

Ответов (5)

Решение

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

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

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

Надеюсь, это поможет вам двигаться в правильном направлении.

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

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

reloadData

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

cellForRowAtIndexPath

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

Boot To The Head правильный.

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

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

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

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

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

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

Из 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.