AsyncDisplayKit 官方文档
最近在拆解学习AsyncDisplayKit这个很知名的轮子,发现这个轮子内容还是非常庞大的,想要分解学习之前必然要先对这个项目如何使用如何工作有一个初步的概念,所以动手准备把官方文档简单的翻译一下,希望更多看不顺英文文档的人,能有个简单的粗略了解,有了这个粗略了解之后,打算再动手准备进行源码分析
AsyncDisplayKit的基础单元是Node,ASDisplayNode是UIView的抽象,就好像UIView是CALayer的抽象,但是不同于Views只能在主线程使用,Nodes是线程安全的,你可以并行在后台线程,实例化他们,配置他们整体的层次结构等
iOS设备有一条黄金准则,想要保持用户交互的流畅和快速响应,你的app必须保证渲染达到每秒60帧。意思就是主线程只有1/60秒的时间来推动每一帧,执行所有布局和绘图代码的时间只有16毫秒!而且由于一些系统级别的开销,你的布局绘图代码一般情况超过10毫秒,就可能引起掉帧
AsyncDisplayKit可以让你把图形解码,文本计算,渲染,等其他UI开销的操作移出主线程,还有一些其他的小把戏,我们后面会降到
如果你之前使用过views,那么你应该已经知道如何使用nodes,大部分的方法都有一个等效的node,大部分的UIView和CALayer的属性都有类似的可用的。任何情况都会有一点点命名差异(例如,clipsToBounds和masksToBounds),node基本上都是默认使用UIView的名字,唯一的例外是node使用position而不是center
当然,你也可以直接访问底层view和layer,使用node.view和node.layer
一些AsyncDisplayKit核心节点包括:
当在项目中替换使用AsyncDisplayKit的时候,一个经常犯的错误就是把一个Node节点直接添加到一个现有的view视图层次结构里。这样做会导致你的节点在渲染的时候会闪烁一下
相反,你应该你应该把nodes节点,当做一个子节点添加到一个容器类里。这些容器类负责告诉所包含的节点,他们现在都是什么状态,以便于尽可能有效的加载数据与渲染。你可以把这些类当做UIKit和ASDK的整合点
下面有4种节点容器
AsyncDisplayKit的排版引擎是非常强大并且独特的,基于CSS FlexBox模型。他提供了一种声明方式来约定自定义节点所属的子节点的大小和布局,当所有的节点同时被默认渲染和展现的时候,通过给每个节点提供一个ASLayoutSpec,异步的测量和布局。
这套排版引擎那个是基于ASLayouts的概念,他包含了位置,大小,ASLayoutSpecs等信息,ASLayoutSpecs定义了不同的布局概念用于计算输出ASLayout结果,排版区域最终由子节点和其他排版区域一同决定
其他排版区域包括:
AsyncDisplayKit是一个UI框架,最初诞生于Facebook App。最开始Facebook团队面临一个很核心的问题:怎么能保证主线程尽可能的简洁,AsyncDisplayKit就是答案。
现在,很多应用程序都会频繁使用手势以及物理动画,再不济,你的app也会很广泛使用某种形式的滚动试图,这类型的用户交互是完全决定于主线程的流畅,并且对主线程的负荷十分敏感,一个被阻塞的主线程就意味着掉帧,卡顿,意味着很不愉快的用户体验
AsyncDisplayKit的Node节点就是一个线程安全的抽象对象,基于UIView和CALayer
[图就不翻译了]
当使用node节点的时候,你可以直接访问大部分的view和layer的属性,唯一区别是,当使用正确的时候,nodes通过异步进行计算,布局,最后默认同时进行渲染
想看更多地异步性能提升,请查看example/ASDKgram app,这个工程对比了基于UIKit的社交媒体demo,和基于ASDK的社交媒体demo
在iPhone6+上的性能提升不是很明显,但是在4S上,性能差距非常之大
AsyncDisplayKit所带来的性能提升,可以让你为每个用户在所有设备上,在所有的网络环境下,提供强大的用户体验设计
AsyncDisplayKit一样也在追求开发人员的使用体验,追求iOS&tvOS跨平台的特性,追求swift&OC语言的兼容性。只需要很少的代码就能构建很棒的app,清晰的架构,健壮的代码(参见examples/ASDKgram这个例子)(开发这个的都是一些超级聪明工作3年多的工程师)
随着AsyncDisplayKit逐渐成熟,很多聪明的工程师都加入一起构建这个项目,可以大幅度节省作为开发者,使用ASDK的开发时间
先进技术
ASRunLoopQueue
ASRangeController 智能预加载
网络工具
automatic batch fetching (e.g. JSON payloads)自动批量抓取