iOS tableview的性能优化,带对比demo

热门标签

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!

一、普通写法的朋友圈

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

iOS tableview的性能优化,带对比demo
二、优化

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

 

标签:

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术Dog|博客
原文地址:《iOS tableview的性能优化,带对比demo》 发布于2019-09-30

分享到:
赞(0) 打赏

评论 抢沙发

4 + 2 =


iOS tableview的性能优化,带对比demo

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?