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/

你可能感兴趣的:(UITableView性能优化问题)