UITableView性能优化问题
TableView为什么会卡?
主要由以下原因:
- cellForRowAtIndexPath:方法中处理了过多业务
- tableviewCell的subview层级太复杂,做了大量透明处理
- cell的height动态变化时计算方式不对
优化核心思想:UITableViewCell重用机制
简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。
Tips:
-
1 提前计算并缓存好高度(布局),因heightForRowAtIndexPath:
是调用最频繁的方法; -
2 异步绘制,遇到复杂界面,参考Facebook的AsyncDisplayKit
和YYAsyncLayer异步绘制框架; -
3 缓存图片(SDWebImage),提前处理好UIImageView图片的尺寸按需加载而不是加载原图;
-
4 计算等耗时操作异步处理,处理完再回主线程更新UI;
-
5 图文混排不定高度采用CoreText排版,缓存Cell高度参考YYKit;
-
6 实现Cell的drawRect:方法直接绘制,减少UIView,UIImageView
,UILabel等容器的使用。
Bonus:
- 1 正确使用reuseIdentifier来重用Cell;
- 2 尽量少用或不用透明图层或View;
- 3 如果Cell内现实的内容来自web,使用异步加载,缓存请求结果;
- 4 减少subviews的数量在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果;
- 5 尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示;
- 6 固定高度不要实现heightForRowAtIndexPath:
方法。
参考资料:
code-uitableviewcell-optimizations-part-1
code-uitableviewcell-optimization-part-2
Perfect smooth scrolling in UITableViews
优化UITableViewCell高度计算的那些事
详细整理:UITableView优化技巧
UITableview性能优化总结
AsyncDisplayKit 教程:达到 60 FPS 的滚动帧率
AsyncDisplayKit
YYAsyncLayer
转载:http://blog.wangruofeng007.com/blog/2016/01/18/tableviewxing-neng-you-hua/