UITableView性能优化

1.Tableview 懒加载、Cell 重用

2.高度缓存(因为 heightForRowAtIndexPath: 是调用最频繁的方法)

1.当 cell 的行高固定时,使用固定行高 self.tableView.rowHeight = 100
2.当 cell 的行高是不固定时,根据内容进行计算后缓存起来使用。第一次肯定会计算,后续使用缓存时就避免了多次计算;高度的计算方法通常写在自定义的cell中,调用时,既可以在设置 cell 高的代理方法中使用,也可以自定义的 model 中使用(且使用时,使用get方法处理)。

3. 数据处理

1.使用正确的数据结构来存储数据
2.数据尽量采用局部的 section,或 cellRow 的刷新,避免 reloadData
3.大量数据操作时,使用异步子线程处理,避免主线程中直接操作
4.缓存请求结果

4.异步加载图片:SDWebImage 的使用

1.使用异步子线程处理,然后再返回主线程操作
2.图片缓存处理,避免多次处理操作
3.图片圆角处理时,设置 layer 的 shouldRasterize 属性为 YES,可以将负载转移给 CPU

5.按需加载内容

1.滑动操作时,只显示目标范围内的 Cell 内容,显示过的超出目标范围内之后则进行清除
2.滑动过程中,不加载显示图片,停止时才加载显示图片

6.视图层面

1.减少 subviews 的数量,自定义的子视图可以整合在形成一个整体的就整合成一个整体的子视图
2.使用 drawRect 进行绘制(即将 GPU 的部分渲染转接给 CPU ),或 CALayer 进行文本或图片的绘制。在实现 drawRect 方法的时候注意减少多余的绘制操作,它的参数 rect 就是我们需要绘制的区域,在 rect 范围之外的区域我们不需要进行绘制,否则会消耗相当大的资源
3.异步绘制,且设置属性 self.layer.drawsAsynchronously = YES;(遇到复杂界面,遇到性能瓶颈时,可能就是突破口)
4.定义一种(尽量少)类型的 Cell 及善用 hidden 隐藏(显示) subviews
5.尽量使所有的 view 的 opaque 属性为 YES,包括 cell 自身,以提高视图渲染速度(避免无用的 alpha 通道合成,降低 GPU 负载)
6.cellForRowAtIndexPath 不要做耗时操作:如不读取文件 / 写入文件;尽量少用 addView 给 Cell 动态添加 View,可以初始化时就添加,然后通过 hide 来控制是否显示
7.我们在 Cell 上添加系统控件的时候,实际上系统都会调用底层的接口进行绘制,大量添加控件时,会消耗很大的资源并且也会影响渲染的性能。当使用默认的 UITableViewCell 并且在它的 ContentView 上面添加控件时会相当消耗性能。所以目前最佳的方法还是继承 UITableViewCell,并重写 drawRect 方法
8.当我们需要圆角效果时,可以使用一张中间透明图片蒙上去使用 ShadowPath 指定 layer 阴影效果路径使用异步进行 layer 渲染(Facebook 开源的异步绘制框架 AsyncDisplayKit )设置 layer 的 opaque 值为 YES ,减少复杂图层合成尽量使用不包含透明(alpha)通道的图片资源尽量设置 layer 的大小值为整形值直接让美工把图片切成圆角进行显示,这是效率最高的一种方案很多情况下用户上传图片进行显示,可以让服务端处理圆角使用代码手动生成圆角 Image 设置到要显示的 View 上,利用 UIBezierPath ( CoreGraphics 框架)画出来圆角图片

本文来源
作者:sampson0115
链接:https://www.jianshu.com/p/6d31da6c1012

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