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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,322评论 4 61
  • 南京大行宫、新街口常常能看见乞讨的人。店家门口、广场周围也有许多卖着廉价山芋、鸡蛋糕、烤玉米的小贩。 他们...
    沽酒郎阅读 1,124评论 0 1
  • 之前一直没有把蚂蚁森林收集能量的事情放在心里,因为我觉得这件事的可信度不清楚不想浪费时间在没有用的事情上,我的...
    梁鸽鸽free阅读 5,458评论 0 1
  • 晚上21点零9分,距离目的地还有1个小时,火车开的很慢很慢,我从宣城回来,见了几个月没见的朋友,聊了一些没有对他说...
    听很多的故事阅读 2,823评论 0 3
  • 我大二了,英文专业。很多时候我都在想如果我当时进了中文系,会不会是现在这个尴尬的样子,英文不想学,中文没空学。...
    时光简成烟阅读 2,454评论 0 0