UITableView 优化

2018-05-30  本文已影响22人  Eddiegooo
主要分为以下几点:
只定义一种Cell。 —— 尽量使用一种类型的cell,subViews可以用hidden、show的方式显示。
提前计算并缓存每个Cell的高度。 —— 在ViewModel中计算好cell的高度,在tableView:heightForRowAtIndexPath:这个方法中直接显示高度, 不用每次都计算。 最好将cell高度缓存。

所以,既然高度总会被用到,那就早早的在获取数据时就计算好吧!

提前创建真正显示的、需要加工的数据并缓存。 —— Cell中显示的内容,很多时候可能并不是直接从服务器拿到的数据,而是经过“加工”的数据。如每个Cell的标题、正文都有可点击的链接Link、表情图片等富文本内容,而我们一般用NSAttributeString类来显示。所以在获得数据的时候,就直接将数据加工好,cell中直接用加工好的数据。

其它

总结

总的来说,就是:
缓存一切可以缓存的!就是“用空间替换时间”!
在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;
}
上一篇 下一篇

猜你喜欢

热点阅读