TableView为什么会卡?

TableView为什么会卡?

主要由以下原因:

cellForRowAtIndexPath:方法中处理了过多业务

tablev

iewCell的subview层级太复杂,做了大量透明处理

cell的height动态变化时计算方式不对

优化核心思想:UITableViewCell重用机制

简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。

Tips:

提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;

异步绘制,遇到复杂界面,参考Facebook的AsyncDisplayKit和YYAsyncLayer异步绘制框架;

缓存图片(SDWebImage),提前处理好UIImageView图片的尺寸按需加载而不是加载原图;

计算等耗时操作异步处理,处理完再回主线程更新UI;

图文混排不定高度采用CoreText排版,缓存Cell高度参考YYKit;

实现Cell的drawRect:方法直接绘制,减少UIView,UIImageView,UILabel等容器的使用。

Bonus:

正确使用reuseIdentifier来重用Cell;

尽量少用或不用透明图层或View;

如果Cell内现实的内容来自web,使用异步加载,缓存请求结果;

减少subviews的数量在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果;

尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示;

固定高度不要实现heightForRowAtIndexPath:方法。

1.UITableViewCell里不要添加太多subview,最好只添加一个cellview。

2.UITableViewCell 上的子View的opaque属性设为YES。其实默认也是不透明。UITableViewCell尽量不要包含透明的子View。

3.在cellview里,重写drawRect函数绘制UITableViewCell的内容。

4.在绘制字符串时,尽可能使用drawAtPoint: withFont:,而不要使用更复杂的drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode; 如果要绘制过长的字符串,建议自己先截断,然后使用drawAtPoint: withFont:方法绘制。

5.在绘制图片时,尽量使用drawAtPoint,而不要使用drawInRect。drawInRect如果在绘制过程中对图片进行放缩,会特别消耗CPU。

6.如果绘制cell过程中,需要下载cell中的图片,建议在绘制cell一段时间后再开启图片下载任务。譬如先画一个默认图片,然后在0.5S后开始下载本cell的图片。

7.即使下载cell 图片是在子线程中进行,在绘制cell过程中,也不能开启过多的子线程。最好只有一个下载图片的子线程在活动。否则也会影响UITableViewCell的绘制,因而影响了UITableViewCell的滑动速度。(建议结合使用NSOpeartion和NSOperationQueue来下载图片,如果想尽可能找的下载图片,可以把[self.queuesetMaxConcurrentOperationCount:4];)

8.最好自己写一个cache,用来缓存UITableView中的UITableViewCell,这样在整个UITableView的生命周期里,一个cell只需绘制一次,并且如果发生内存不足,也可以有效的释放掉缓存的cell。

9.不要将tableview的背景颜色设置成一个图片。这回严重影响UITableView的滑动速度。在限时免费搜索里,我曾经翻过一个错误:self.tableView_.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"background.png"]]; 通过这种方式设置UITableView的背景颜色会严重影响UTIableView的滑动流畅性。修改成`self.tableView_.backgroundColor` = [UIColor clearColor];之后,fps从43上升到60左右。滑动比较流畅。

10.cell的行高不是固定值,需要计算,则要尽可能缓存行高值,避免重复计算行高。这里指的是UITableViewDelegate里的行高函数。

如果做到以上10点,则UITableView 滑动的fps可以达到60 fps。滑动非常顺畅

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,033评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,795评论 8 265
  • 这是最近播出的韩剧名字,讲述的是一个奇幻的漫画故事。这部韩剧题材很新颖,很大胆,既不显得老套,也不唐突,真的很建议...
    雪初穗子阅读 619评论 0 0
  • 两种表达方式没有绝对的对或错,则反证法就是用来证明对错的
    淄川DDM赵鑫阅读 262评论 0 0