UITableView 优化
2018-05-30 本文已影响22人
Eddiegooo
主要分为以下几点:
只定义一种Cell。 —— 尽量使用一种类型的cell,subViews可以用hidden、show的方式显示。
提前计算并缓存每个Cell的高度。 —— 在ViewModel中计算好cell的高度,在tableView:heightForRowAtIndexPath:
这个方法中直接显示高度, 不用每次都计算。 最好将cell高度缓存。
所以,既然高度总会被用到,那就早早的在获取数据时就计算好吧!
提前创建真正显示的、需要加工的数据并缓存。 —— Cell中显示的内容,很多时候可能并不是直接从服务器拿到的数据,而是经过“加工”的数据。如每个Cell的标题、正文都有可点击的链接Link、表情图片等富文本内容,而我们一般用NSAttributeString类来显示。所以在获得数据的时候,就直接将数据加工好,cell中直接用加工好的数据。
其它
- 尽量设置Cell的view为opaque,避免GPU对Cell下面的内容也进行绘制。
- 避免大量的图片缩放、颜色渐变等。
- 避免同步的从网络、文件获取数据(这个是必须的=。=)
- 用shadowPath创建阴影。
- 尽量减少subview的数量,如多用drawRect绘制元素,替代用view显示。
- 尽量显示“大小刚好合适”的图片资源。
总结
总的来说,就是:
缓存一切可以缓存的!就是“用空间替换时间”!
在UITableView的Delegate、DataSource方法中,减少任何不必要的操作
除了上面最主要的三个方面外,还有很多几乎大伙都很熟知的优化点:
正确使用reuseIdentifier来重用Cells;
尽量使所有的view opaque,包括Cell自身;
尽量少用或不用透明图层;
如果Cell内现实的内容来自web,使用异步加载,缓存请求结果;
减少subviews的数量;
在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果;
尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示;
实用Tips:
关于正确使用reuseIdentifier来重用Cells 可能会出现一个问题:
重用机制有时会把缓存池中的那个cell的图片放到新出现的cell上,导致图片错乱。。
一般方法:每个cell用不同的reuseIdentifier。 但是这样cell很多的时候,性能会有影响。
解决办法:重写prepareForReuse
方法,将imageView置空。
- (void)prepareForReuse {
[super prepareForReuse];
self.imageView.image = nil;
}