一次 TableView 性能优化经历
2016-01-05 15:31
549 查看
遇到了一个Tableview卡帧的问题,花了点时间才解决,记录一下吧。好了,废话不多说,先上张效果图:
ps:其实是仿照nice的照片详情浏览效果
现在的照片详情页面是一个单独的页面(vc),用户想看其他的照片详情,需返回上一级页面,再点击进来,然后下个版本产品想改成上面那种效果。当时我想到两种方案:
一:用一个倾斜90°的tableview来做,简单,不用自己维护重用队列,每个cell放一个 vc 的view 就可以了,so easy。但是后面出现了问题,没记太清,当时也忘了截图,就换用第二种方案。
二:用scrollView来写,自己来维护重用队列,具体做法大家可以参考 UIScrollView 实践经验 (3.重用) 。最后“完美”地实现了需求,开始做别的需求去了。
因为当时在模拟器上开发,也没想到真机上会卡帧。过了1天,这个功能提交给测试,然后就发现了问题:在scrollView滚动的时候,明显的感觉到了卡帧,然后就开始优化。
ps:有关TableView的效果一定要跑真机!!有关TableView的效果一定要跑真机!!有关TableView的效果一定要跑真机!! (重要的事说三遍)
卡帧猜想
因为也没有仔细看那个vc以及cell中的代码,就大概猜想了一下卡帧的原因:
1.尼玛,该不会是 UIScrollView的重用 没写好?
断点验证了下,vc只会创建3个,重用没问题呀。
2.因为涉及重用,所有vc里面tableview的内容肯定不是一下子全请求出来的,每滚动一次才会去请求下个页面的数据,以及初始化页面。然后再看nice,忽然发现它滚动的时候,状态栏居然没有网络请求的小菊花!!难不成是一次请求的?应该不会吧,这么多数据呀。为了验证这种猜想,用 Charles 拦截下,结果nice也是每滚动次发次请求的:
iOS开发工具-网络封包分析工具Charles
3.这个时候我又想到去搜nice的iOS工程师的github 和 博客,可惜github不能搜组织,就在微博搜了下
(互相关注 是后来事)
最后找到了他的博客,但是可惜没有找到我想要的。。。
进入正题
不管什么原因,先跑下Instruments三件套吧(Time Profiler,Core Animation,GPU Driver)
性能调优
好嘛,真是卡,一个一个看吧
1.首先排除了GPU的问题
2.CPU
这算多吗?我不太确定,对比 上面性能调优一文中的这段
得了,还是看那个vc里面是怎么写得吧??
要声明一点的是,我们项目中没有用到model,用的全是字典…
首先,cell的高度没有缓存,这肯定有影响。另外,在打断点调试的过程中,发现refreshData的success block回调居然执行2次,这岂不是意味着tableview要reloadData两次,短时间刷新2次,肯定会卡啊,继续往里面看
HBStoryDetailFetcher.m
HBCommentListFetcher.m
然后发现@property (assign,nonatomic) float maxCacheAge; //缓存过期时间 单位分钟 默认是0的,这尼玛缓存分分钟过期啊,不过想想之前是一个单独的vc,这样做也挺好的,不过现在滚动中请求就有点不好了。先把数据请求设置成只从网络中获取吧,看看效果先:
请相信我快速滑动的速度是一样一样滴!
区域1是快速滑动的,感觉还可以,帧数也比较稳定。区域2是慢滑,在滚动到中间的时候还是感到有点小卡。不过现在已经好很多了,再接着优化,重点排查这几个方法:
参考:iOS性能优化
在 - (void)loadLikeUsers 方法中
很明显,反复创建View是不可取的…一般都会在初始化的时候全部创建,然后控制显示和隐藏。另外还有圆角。。。 (ps:这个View是照片下面的点赞头像)
参考:小心别让圆角成了你列表的帧数杀手
而且还发现下载下来的图片尺寸跟View的大小还不一致。。。
得了,修改下下载图片的尺寸。
在 - (void)loadComments 方法中
我隐约记得,vc中cellForRow方法中 HBStoryDetailCell 的 isStoryDetailView 属性是设为YES的。这。。。为毛没个return呢?都隐藏了,下面还走毛线啊??
网络请求
换成子线程写入文件
另外最后改了一下scrollView滚动时网络请求的位置
大体改完之后来看下效果:
请相信我快速滑动的速度是一样一样滴!
个人感觉快滑和慢滑时的流畅度还可以呢,只不过到最后heightForRowAtIndexPath 这个方法还是没优化,主要是感觉太麻烦
最后
个人感觉,其实UITableView的优化要注意的点就那么多,大家平时多注意下应该就不会有什么问题了。
参考与推荐
About Instruments
iOS应用性能调优的25个建议和技巧
iOS性能优化
UITableView优化技巧
小心别让圆角成了你列表的帧数杀手
提升UITableView性能-复杂页面的优化
UITableView 滚动流畅性优化
ps:其实是仿照nice的照片详情浏览效果
现在的照片详情页面是一个单独的页面(vc),用户想看其他的照片详情,需返回上一级页面,再点击进来,然后下个版本产品想改成上面那种效果。当时我想到两种方案:
一:用一个倾斜90°的tableview来做,简单,不用自己维护重用队列,每个cell放一个 vc 的view 就可以了,so easy。但是后面出现了问题,没记太清,当时也忘了截图,就换用第二种方案。
二:用scrollView来写,自己来维护重用队列,具体做法大家可以参考 UIScrollView 实践经验 (3.重用) 。最后“完美”地实现了需求,开始做别的需求去了。
因为当时在模拟器上开发,也没想到真机上会卡帧。过了1天,这个功能提交给测试,然后就发现了问题:在scrollView滚动的时候,明显的感觉到了卡帧,然后就开始优化。
ps:有关TableView的效果一定要跑真机!!有关TableView的效果一定要跑真机!!有关TableView的效果一定要跑真机!! (重要的事说三遍)
卡帧猜想
因为也没有仔细看那个vc以及cell中的代码,就大概猜想了一下卡帧的原因:
1.尼玛,该不会是 UIScrollView的重用 没写好?
断点验证了下,vc只会创建3个,重用没问题呀。
2.因为涉及重用,所有vc里面tableview的内容肯定不是一下子全请求出来的,每滚动一次才会去请求下个页面的数据,以及初始化页面。然后再看nice,忽然发现它滚动的时候,状态栏居然没有网络请求的小菊花!!难不成是一次请求的?应该不会吧,这么多数据呀。为了验证这种猜想,用 Charles 拦截下,结果nice也是每滚动次发次请求的:
iOS开发工具-网络封包分析工具Charles
3.这个时候我又想到去搜nice的iOS工程师的github 和 博客,可惜github不能搜组织,就在微博搜了下
(互相关注 是后来事)
最后找到了他的博客,但是可惜没有找到我想要的。。。
进入正题
不管什么原因,先跑下Instruments三件套吧(Time Profiler,Core Animation,GPU Driver)
性能调优
好嘛,真是卡,一个一个看吧
1.首先排除了GPU的问题
2.CPU
这算多吗?我不太确定,对比 上面性能调优一文中的这段
得了,还是看那个vc里面是怎么写得吧??
要声明一点的是,我们项目中没有用到model,用的全是字典…
请相信我快速滑动的速度是一样一样滴!
区域1是快速滑动的,感觉还可以,帧数也比较稳定。区域2是慢滑,在滚动到中间的时候还是感到有点小卡。不过现在已经好很多了,再接着优化,重点排查这几个方法:
参考:iOS性能优化
在 - (void)loadLikeUsers 方法中
很明显,反复创建View是不可取的…一般都会在初始化的时候全部创建,然后控制显示和隐藏。另外还有圆角。。。 (ps:这个View是照片下面的点赞头像)
参考:小心别让圆角成了你列表的帧数杀手
而且还发现下载下来的图片尺寸跟View的大小还不一致。。。
在 - (void)loadComments 方法中
网络请求
另外最后改了一下scrollView滚动时网络请求的位置
请相信我快速滑动的速度是一样一样滴!
个人感觉快滑和慢滑时的流畅度还可以呢,只不过到最后heightForRowAtIndexPath 这个方法还是没优化,主要是感觉太麻烦
最后
个人感觉,其实UITableView的优化要注意的点就那么多,大家平时多注意下应该就不会有什么问题了。
参考与推荐
About Instruments
iOS应用性能调优的25个建议和技巧
iOS性能优化
UITableView优化技巧
小心别让圆角成了你列表的帧数杀手
提升UITableView性能-复杂页面的优化
UITableView 滚动流畅性优化
相关文章推荐
- 对handler机制的回答
- Cocoapods使用第三方的步骤
- Python判断文件和文件夹是否存在的方法
- 过滤器Filter高级应用
- freemarker自己定义标签(二)
- Power Builder的学习
- [LeetCode]Maximum Size Subarray Sum Equals k
- 装饰模式
- glusterfs搭建安装
- rails 事务/回滚
- C++中引用与指针的区别(详细介绍)
- RCNN SPP_net
- LeetCode108 Convert Sorted Array to Binary Search Tree
- SAP R3 给工厂分配采购组织
- SAP R3 给工厂分配采购组织
- 用mysql实现类似于oracle dblink的功能
- 验证框架的配置及validation.xml常用的验证规则
- 地图需要改的参数
- 过滤器Filter典型应用
- 【转】内核态文件操作--不错