UITableView的reloadData有多贵?

时间:2009-02-27 16:26:30

标签: iphone objective-c cocoa-touch

我很好奇,就资源而言,UITableView的reloadData是多么昂贵?我有一个应用程序,它将产生大约10个后续的HTTP请求,并且当它获取数据/ preps时,它会重新加载tableView。随着数据集越来越大,它变得非常缓慢。我正在试图弄清楚是不是因为我正在重新加载tableView的次数,或者是因为我正在抓取/解析数据。

在这种情况下,最佳做法是什么?

5 个答案:

答案 0 :(得分:16)

来自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,则应尝试使用适当的方法为添加和删除行设置动画。

答案 1 :(得分:5)

最佳做法是让cellForRowAtIndexPath:的实施做尽可能少的工作。实际上,除了使用需要显示的数据填充UITableViewCell实例之外,它实际上不应该做任何工作。

您应该使用缓存的UITableViewCell,这样您就不必每次都分配新的单元格。如果你可以在一个单独的线程中进行解析,并使解析后的数据准备好呈现,cellForRowAtIndexPath:可以访问,那么你不应该有任何性能问题。

您没有说明您是否使用自定义UITableViewCell子类,但如果您使用,则深层视图层次结构也会出现性能问题,因为层次结构中的每个视图都会被绘制。你可以使UITableViewCell更好。

希望能让你朝着正确的方向前进。

答案 2 :(得分:4)

要做的最好的事情是分析您的应用以查看它的速度。

那就是说,如果你的桌子高度都相同,那么我想

  

reloadData

只需要打电话

  

的cellForRowAtIndexPath

表示屏幕上可见的单元格。

答案 3 :(得分:2)

表视图重新加载费用是:

  1. 弄清楚有多少部分和 每个部分的行数
  2. 排高。
  3. 只要您调用重装数据,就会计算出表格中所有元素的行高。

    剩下的费用是cellForRowAtIndexPath,这通常不会太糟糕,因为它只会被调用为屏幕上的行数。如果不按照预期重复使用单元格,滚动时可能会很糟糕。

    关键是你可能会问自己是什么触发了HTML加载并可能将其移入后台线程。

答案 4 :(得分:1)

Boot To The Head是正确的。

我正在Instapaper中进行逐步的逐一文章列表更新,并在每次完成下载时调用-reloadData。听起来与你正在做的相似。它不会导致任何明显的性能下降。