我很好奇,就资源而言,UITableView的reloadData是多么昂贵?我有一个应用程序,它将产生大约10个后续的HTTP请求,并且当它获取数据/ preps时,它会重新加载tableView。随着数据集越来越大,它变得非常缓慢。我正在试图弄清楚是不是因为我正在重新加载tableView的次数,或者是因为我正在抓取/解析数据。
在这种情况下,最佳做法是什么?
答案 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)
表视图重新加载费用是:
只要您调用重装数据,就会计算出表格中所有元素的行高。
剩下的费用是cellForRowAtIndexPath,这通常不会太糟糕,因为它只会被调用为屏幕上的行数。如果不按照预期重复使用单元格,滚动时可能会很糟糕。
关键是你可能会问自己是什么触发了HTML加载并可能将其移入后台线程。
答案 4 :(得分:1)
Boot To The Head是正确的。
我正在Instapaper中进行逐步的逐一文章列表更新,并在每次完成下载时调用-reloadData。听起来与你正在做的相似。它不会导致任何明显的性能下降。