tableView 卡顿优化的标准解决: Async View

本文介绍了如何通过Async View解决UITableView滚动卡顿的问题,特别是使用Graver框架进行异步渲染和多线程处理,从而提高性能。文章详细讲解了Graver的实现原理,包括画布基类、事件处理和异步渲染流程,并提到了对Core Text的封装以及动画和事件处理的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小灰学习 tableView 卡顿优化, 当然是用 Async View

小灰看下 gg 了的 Graver 框架

问题与解决: 在渲染上

复杂的 cell , 滚动起来,容易卡顿

复杂,即包含很多控件 ( 位图 ),形成一颗复杂的图层树

下图,是一个简单的 cell, 层次有一些

截屏2021-11-01 下午3.51.08.png

Graver 可,一个 cell, 变成一张位图,层次简单

截屏2021-11-01 下午3.55.37.png

而且 graver ,充分利用多线程

回顾下流程

1, 拿到网络请求的数据,大家都是这么做的

截屏2021-11-01 下午4.01.35.png

2, 业务数据的加工,方便渲染

AFN 的结果回调线程,不使用主线程,

开个子线程,去处理

截屏2021-11-01 下午4.03.01.png

上一篇,tableView 卡顿优化,除了缓存计算高度,还可以…

就是这么做的

3, 异步渲染

three.png

思路: 图片绘制,比较简单

核心是,只有主线程,才能操作 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值