虽然node的异步并行渲染和布局计算能力已经让其十分强大,但他还有一层至关重要的能力就是智能预加载.
就像在入门这个章节提到的,在node容器(node containers)之外使用node没有什么好处.这是因为所有nodes都有一个当前界面状态(current interface state)的概念.
这个界面状态属性(interfaceState property)会频繁的被ASRangeController更新. ASRangeController是个创建和持有所有node容器(node containers)管理器.
把node放在node容器(node containers)之外使用时,它的状态(current interface state)将不会被任何ASRangeController更新.通常这会造成没有任何警告的屏幕闪烁,这是因为尽管nodes意识到了他们已经显示在屏幕上,仍然会再次进行渲染.
界面状态区域
当nodes被加入到可滚动或可翻页的界面时,他们一般处于下面这个区域的某个状态.这表示当页面滚动时,node会经过这些区域,从而被更新到对应的状态.
|界面状态| 描述|
|:-:|:-:|:-:|
|预加载| 离"已可见"最远的状态.用来读取数据,数据来源可以是网络接口或本地磁盘|
|将显示| 用于处理显示任务,比如文本光栅化和图片解码|
|已可见| node(至少有一个像素)已经显示在屏幕上|
ASRangeTuningParameters
每个状态区域的大小是根据"满屏"为单位来计算的.通常情况下,使用默认尺寸就可以满足需求.不过你也可以通过调整参数的方式,轻松的调整scrolling node的区域类型(的范围).
上面是一张collection的滚动示意图,用户正在往下滚动屏幕.如图所示,相同的状态下,处在用户滚动方向的区域(头部区域),比移出屏幕方向的区域(尾部区域)大.如果用户更换了滚动方向(朝上滚动),头部和尾部会动态的切换,以保证内存的最优化使用.这使你只需要考虑如何定义头部尾部范围的大小,而不必关心用户滚动方向的变化.
智能预加载还可以在多维度的情况下工作.
界面状态回调
当用户滚动界面时,nodes经过这些区域,并做出对应的响应.比如加载数据,渲染等.你自定义的node子类型可以轻松的通过实现相关回调方法来参与这个机制.
(但是不要忘记调用super方法~)
Visible Range
- didEnterVisibleState
- didExitVisibleState
Display Range
- didEnterDisplayState
- didExitDisplayState
Preload Range
- didEnterPreloadState
- didExitPreloadState