UITableView在实际开发中使用频率实在是很高, 因此, UITableView的性能优化是必不可少的, 本文下面就略微总结一下UITableView性能优化那点事.
本文着重介绍具体方法, 原理的话在文章最后会给出一些链接, 有兴趣可以自行查看.
1. 关于数据绑定
很多新加入iOS的朋友喜欢把数据绑定写入在UITableView Data Source方法
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
里面. 这并不是十分之准确的, 因为这时候的cell还没有被实际产生, 试着把数据绑定写在
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
这个方法上, 因为这时候cell已经被创建而且正在准备显示到界面上了.
2. 关于cell的重用.
cell的重用是苹果官方就一再推荐的, 所以保证自己创建的cell是重用的会对性能提升有很大的帮助.
3. 关于高度计算
高度计算的方法如果调用多次, 对性能损耗是肯定的. 当然如果你的高度是定死的话, 就不会出现这个问题. 如果不是的话, 那么你可能需要自己设计一个方法, 把每个需要显示的cell的高度先计算出来, 然后再设置cell高度的时候直接调用.
提供一个计算cell内容高度的方法(截取网上的):
然后高度设置可以在下面实现:
4. 关于AutoLayout
尽管苹果官方推荐使用autoLayout进行程序开发, 但是autoLayout会带来性能的一些损耗, 当然, 如果你的程序对性能要求不是很高的话, 用autoLayout进行开发也是很方便的.
5. 关于CPU和GPU的调度使用
各种透明度, 圆角等layer的属性都会引起性能损耗.
所以, 可以试着不要直接设置图片的圆角, 先异步获取图片,调用CoreGraphics 处理好图片再返回
这样你的图片处理就交给了后台而不会影响到你程序的流畅性了
6. 关于其他优化方法
可以试着使用这个 https://github.com/facebook/AsyncDisplayKit 框架, 框架集成了大量异步操作, 把UIView -> CALayer 转变成 CAlayer -> Node, 这样的轻量级控件加上异步操作, 会使你的程序性能更上一层楼.
2、如何提高tableView的性能
a、重用cell
我们都知道申请内存是需要时间,特别是在一段时间内频繁的申请内存将会造成很大的开销,而且上tebleView中cell大部分情况下布局都是一样的,这个时候我们可以通过回收重用机制来提高性能。
b、避免content的重新布局
尽量避免在重用cell时候,对cell的重新布局,一般情况在在创建cell的时候就将cell布局好。
c、使用不透明的subView
在定制cell的时候,将要添加的subView设置成不透明的会大大减少多个view层叠加时渲染所需要的时间。
d、如果方便,直接重载subView的drawRect方法
如果定制cell的过程中需要多个小的元素的话,最好直接对要显示的多个项目进行绘制,而不是采用添加多个subView。
e、tableView的delegate的方法如非必要,尽量不要实现
tableView的delegate中的很多函数提供了对cell属性的进一步控制,比如每个cell的高度,cell是否可以编辑,支持的edit风格等,如非必要最好不要实现这些方法因为快速的调用这些方法也会影响性能。
附上一些链接:
1. http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
2. http://southpeak.github.io/blog/2015/12/20/perfect-smooth-scrolling-in-uitableviews/
然后推荐几个喜欢的技术博客吧:
1. http://blog.ibireme.com
2. http://www.superqq.com
3. http://southpeak.github.io