迁移一批老文章到掘金 本文(二)太监了╮(╯_╰)╭
本篇文章的全文可以用另一个文章标题来概括!
我们为什么压根不应该使用 AsyncDisplayKit
而我的异步绘制的后面那一篇文章也可以用另一个文章标题来概括!
不用 AsyncDisplayKit,我们怎么异步绘制
Facebook 出得这个 AsyncDisplayKit 严格意义上讲,已经远远超出了超出了 AsyncDisplay 的范围.
我个人在最开始思考 AsyncDisplay 的时候,以为这只是一个解决异步渲染的问题,可能是最大限度的在 layer 层 display 的时候做文章,直到我粗略了学习了下他的源码,才发现,我只看到了 ASDK 中很小很小很小的一块。
ASDK 其实已经十分庞大,涵盖了 AsyncQueueControl(异步队列控制),在队列控制基础上封装的 AsyncDisplay(异步绘制),AsyncLayout(异步 UI 布局计算),AsyncFetchData(异步数据准备),AsyncTextLayout(异步文字排版)并且又在此之上,重写了一整套几乎我们能用到的所有 UIKit 控件,小到 ImageView,Button,Text,大到 Tableview,CollectionView,再到 ViewController,全都一一对应重写了一套 ASDK 的 ASXXNode
因此,使用 ASDK 的开发者,面临的最大问题是,虽然 ASDK 各方面的用法都是尽可能做到很像 UIKit 的,并且支持兼容从旧的 UIKit 生成新的 ASNode,但是如果想使用 ASDK,势必得完全改变以前的编码习惯,以前的旧代码,再开发 UI 的时候,完全使用 ASXX 开头的控件,放弃苹果官方的 frame 布局,或者官方的 autolayout,转而使用 ASDK 的 layout 方案(支持自己扩展),如果涉及文字,也要使用 ASText 相关的富文本描述(支持自己扩展),如果涉及 Tableview CollectionView,甚至写代理的习惯都要跟着改变和适应
对于我们来说,想要引入 ASDK,确实太重了,我们不妨把它当做一个学习样本,去拆解分析一下这里面是如何运作的
就好像所有的 UIKit 最重都是从 UIView 继承一样,ASDisplayNode 就是整个 AsyncDisplayKit 的基石,几乎所有的 AS 对象都是从 ASDisplayNode 继承出来(ASViewController,ASRangeController,ASDataController 等例外)
此图是官网一个截图,便于我们去进行类比理解 ASDisplayNode VS UIView
CALayer
UIView
ASDisplayNode
可以看看 ASXXNode 系列,都有哪些,下图里面并没有举例完所有的 public ASNode,只是粗略列出常用的
是不是很像,UIView->UIControl->UIButton 的 UIKit 继承结构
每一个 Node 节点是可以直接通过 UIView 的
方法添加到原本的 UIView 之上,但是官方在文档里并不推荐这么做,我前一篇的官方文档翻译中有写
- addSubnode
当在项目中替换使用 AsyncDisplayKit 的时候,一个经常犯的错误就是把一个 Node 节点直接添加到一个现有的 view 视图层次结构里。这样做会导致你的节点在渲染的时候会闪烁一下
相反,你应该你应该把 nodes 节点,当做一个子节点添加到一个容器类里。这些容器类负责告诉所包含的节点,他们现在都是什么状态,以便于尽可能有效的加载数据与渲染。你可以把这些类当做 UIKit 和 ASDK 的整合点
借助 nodes 容器可以更好的对容器内子 nodes 进行管理和渲染控制,这是官方推荐使用的,因此我们引出了节点容器的概念
ASViewController
ASViewController 就是这样的一种节点容器,它并非继承自 ASDisplayNode,而是直接继承自 UIViewController,就好像每一个 UIViewController 一定要有一个 self.view 一样,ASViewController 必须由一个 ASDisplayNode 进行初始化。
ASTableNode
ASCollectionNode
这两个节点,本身就是一个 ASDisplayNode 节点,但它同时也有节点容器的作用
不仅如此,Table 和 Collection 都是用于滚动并且批量展示数据的,ASDK 还特意为此封装了一套复杂的处理 ---- 滚动情况下的数据异步加载过程。
因此他内部有两个很特殊的控制器
讲到这里,还有 2 个重要的东西没说明
方法的时候,就是主线程将要发生绘制的时候,会把相关绘制的操作,ASDisplayNode 会将绘制任务提交给 ASAsyncTransaction,在他内部的线程队列里进行绘制运算,当运算完毕,将绘制结果抛回主线程渲染到屏幕上。
- display
大致的轮廓可以看上面,ASDK 非常大,里面还有太多太多的细节,比如专门为 ASText 相关的 Node,写了一整套独特的 ASTextLayout,整个框架里很多关键的类都可以深入展开,详细说太多太多
下一篇分析就决定从 ASDisplayNode + ASAsyncTransaction 入手,重点去拆解学习,异步渲染这个过程。聚焦于整个 Display 环节。
我的本意是重点学习和分析异步渲染,然后可以不引入 ASDK 如此大的 framework 来解决实际项目中遇到的渲染性能问题。
至于 ASLayout 以及 RangeController,DataController,由于 ASDK 太大,短时间内由于涵盖的东西太多,慢慢来吧╮(╯_╰)╭
来源: https://juejin.im/post/5a31409af265da4309452952