tableview的性能优化,带对比demo

一、普通写法的朋友圈

为了做对比,这里我用普通方法编写了朋友圈(PS:这里朋友圈是比较简陋的哈,但可以反映问题)。在项目的SubView文件夹下面,一个model对应一个cell,在给cell赋值model时候,重新计算每部分的高度,重新布局。这样设计的代码,你操作软件会发现FPS值可以降到50(60是最顺畅的),特别是当内容是带有大量表情图片的时候,FPS值更是低,你能很明显地感觉到卡顿的效果。

二、优化

1、进过了多次的实验,发现对tableView性能影响最大的是每个cell高度的获取heightForRowAtIndexPath,这个函数会调用很多次,对于不是固定高度的cell,每次都需要去计算。像朋友圈这种,内容框的高度是需要通过计算文字得到高度的,这种大量的操作是很损耗性能的。所以,可以一开始就计算好每个cell的高度,并且缓存起来,下次直接从缓存拿过来用。

2、对于带有大量表情图片的文本的cell,渲染需要消耗一定得性能。可以把消耗性能的操作放到线程中执行,即将展再回到主线程。

3、使用YYKit的YYLabel可以很好地解决上面的问题。

通过cocopad导入:pod 'YYKit', '~> 1.0.9'

优化的代码在项目的NewSubView目录下,FriendLayout结构保存FriendMode和cell的高度,在生成FriendMode的时候就计算高度并缓存起来:

FriendLayout *layout = [[FriendLayout alloc] initWithModel:model];

通过FriendLayout知道,我保存了内容的contentLayout和保存每个评论layout的数组commentLayoutArr。通过layout我们可以得到这段文本的内容,大小,行距,行数等,很强大对吧,所以后面我们直接使用layout进行操作就可以了。想了解更多请关注YYKit库(毕竟是国内大神写的一个比较好的库,很推荐大家去看看)。

通过使用YYLabel控件,你会发现性能提高了太多,FPS基本维持在60,偶尔遇到多表情的文本展示FPS会59,但不太影响。如果还想达到最优,还可以开启YYLabel的异步展示属性:

_contentLab.displaysAsynchronously = YES;  //比较耗时的渲染操作在后台运行

_contentLab.clearContentsBeforeAsynchronouslyDisplay = NO;  //在进行后台渲染前是否清除掉之前的内容,如果YES就会先清除之前的内容,可能会出现空白

在项目中的ViewController中

#define FLAG              //去掉注释,就是开启了优化的代码,注释就是使用非优化代码

通过控制上面的宏定义可以切换两种模式的代码,让你进行性能对比

项目代码:https://github.com/wulang150/ProTableViewTest

你可能感兴趣的:(tableview的性能优化,带对比demo)