一、普通写法的朋友圈
为了做对比,这里我用普通方法编写了朋友圈(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 //去掉注释,就是开启了优化的代码,注释就是使用非优化代码
通过控制上面的宏定义可以切换两种模式的代码,让你进行性能对比
网友评论