小灰学习 tableView 卡顿优化, 当然是用 Async View
小灰看下 gg 了的 Graver 框架
问题与解决: 在渲染上
复杂的 cell , 滚动起来,容易卡顿
复杂,即包含很多控件 ( 位图 ),形成一颗复杂的图层树
下图,是一个简单的 cell, 层次有一些
Graver 可,一个 cell, 变成一张位图,层次简单
而且 graver ,充分利用多线程
回顾下流程
1, 拿到网络请求的数据,大家都是这么做的
2, 业务数据的加工,方便渲染
AFN 的结果回调线程,不使用主线程,
开个子线程,去处理
上一篇,tableView 卡顿优化,除了缓存计算高度,还可以…
就是这么做的
3, 异步渲染
思路: 图片绘制,比较简单
核心是,只有主线程,才能操作 UI
要充分利用多线程,则不能停留在 UIKit, 基本不使用 addSubview:
CALayer 就得上场了
多线程绘制技术
UI 绘制,走 func draw(
, 这个是主线程
override func draw(_ rect: CGRect) {
}
需求是,多线程
实现了,下面的方法,就不会跑 func draw(
override func draw(_ layer: CALayer, in ctx: CGContext) {
}
如果走完
func draw(_ layer: CALayer, in
,
接着走
func draw(
,
需要调用父类
override func draw(_ layer: CALayer, in ctx: CGContext) {
super.draw(layer, in: ctx)
}
不走 func draw(
,
效果类似
override func display(_ layer: CALayer) {
}
graver 的实现:
首先是画布
WMGAsyncDrawView
作为基类,负责绘制的逻辑
WMGAsyncDrawLayer
配合 WMGAsyncDrawView
使用,状态控制
WMGCanvasView
继承自 WMGAsyncDrawLayer
,
于绘制的基础上,添加常见的能力:
圆角、边框、阴影
WMGCanvasControl
继承自 WMGCanvasView
添加事件处理
- 系统的,码控件,
一个控件,一张位图,一个 target - action
- 现在是一张大的位图,不同的位置,对应不同的事件
下文重点讲
一般就用到
WMGCanvasView
,