ASDK的核心概念
一: 預(yù)加載
二: Node Containers
三: Node Subclasses
一: 預(yù)加載
Texture
的異步渲染、計(jì)算和測(cè)量特性使其非常強(qiáng)大,另外對(duì)于textuer
來(lái)說(shuō)另一個(gè)至關(guān)重要是智能預(yù)加載。
正如“入門指南”中指出的那樣痰催,node
脫離'node containers'將變的一無(wú)是處。這是由于所有node
都具備接口狀態(tài)的概念。
所有容器都在內(nèi)部創(chuàng)建和維護(hù)的ASRangeController
用于更新node
的狀態(tài)
在容器外部使用的節(jié)點(diǎn)不會(huì)由任何范圍控制器更新其狀態(tài)鹤耍。這有時(shí)會(huì)導(dǎo)致閃爍,我們無(wú)法捕捉每個(gè)node
的狀態(tài)
1.1: Interface State Ranges(接口狀態(tài)范圍)
當(dāng)節(jié)點(diǎn)添加到滾動(dòng)或分頁(yè)界面時(shí)验辞,它們通常位于以下范圍之一中稿黄。這意味著隨著滾動(dòng)視圖的滾動(dòng),它們的界面狀態(tài)將在它們移動(dòng)過(guò)程中更新跌造。
節(jié)點(diǎn)將處于以下范圍之一中:
接口狀態(tài) | 描述 |
---|---|
Preload | 遠(yuǎn)離可見(jiàn)的最遠(yuǎn)距離抛猖。這是從外部來(lái)源收集內(nèi)容的地方,無(wú)論是API還是本地磁盤鼻听。 |
Display | 在這里财著,顯示任務(wù),如文本光柵化和圖像解碼撑碴。 |
Visible | 該節(jié)點(diǎn)在屏幕上至少有一個(gè)像素撑教。 |
1.2: ASRangeTuningParameters(范圍的調(diào)節(jié)參數(shù))
每個(gè)這些范圍的大小以“screenfuls”來(lái)衡量。盡管默認(rèn)大小在很多用例中都能很好地工作醉拓,但可以通過(guò)在滾動(dòng)節(jié)點(diǎn)上為范圍類型設(shè)置調(diào)整參數(shù)來(lái)輕松調(diào)整它們伟姐。
在上述滾動(dòng)collection
的可視化中收苏,用戶正在向下滾動(dòng)。如您所見(jiàn)愤兵,將要展示方向上的范圍大小比用戶遠(yuǎn)離的內(nèi)容(拖尾方向)大得多鹿霸。 如果用戶要改變方向,則前端和后端將動(dòng)態(tài)交換以保持內(nèi)存使用最佳秆乳。 這使您可以擔(dān)心定義前導(dǎo)和尾隨尺寸懦鼠,而無(wú)需擔(dān)心對(duì)用戶變化的滾動(dòng)方向作出反應(yīng)。
智能預(yù)加載也可以在多個(gè)方面工作屹堰。
1.3: Interface State Callbacks(接口狀態(tài)的回調(diào))
當(dāng)用戶滾動(dòng)時(shí)肛冶,node
在范圍內(nèi)移動(dòng)并通過(guò)加載數(shù)據(jù),渲染等方式做出適當(dāng)反應(yīng)扯键。您自己的節(jié)點(diǎn)子類可以通過(guò)實(shí)現(xiàn)相應(yīng)的回調(diào)方法輕松訪問(wèn)此機(jī)制睦袖。
- 1: Visible Range(可見(jiàn)區(qū)域)
-didEnterVisibleState
-didExitVisibleState
- 2: Display Range(將要呈現(xiàn))
-didEnterDisplayState
-didExitDisplayState
- 3: Preload Range(遠(yuǎn)端加載)
-didEnterPreloadState
-didExitPreloadState
二: Node Containers(節(jié)點(diǎn)容器)
2.1: Use Nodes in Node Containers(在節(jié)點(diǎn)容器中使用節(jié)點(diǎn))
強(qiáng)烈建議您在節(jié)點(diǎn)容器中使用Texture的節(jié)點(diǎn)。 Texture提供以下節(jié)點(diǎn)容器荣刑。
Texture節(jié)點(diǎn)容器 | UIKit等效 |
---|---|
ASCollectionNode | UICollectionView |
ASPagerNode | UIPageViewController |
ASTableNode | UITableView |
ASViewController | UIViewController |
ASNavigationController | UINavigationController 實(shí)現(xiàn)ASVisibility 協(xié)議馅笙。 |
ASTabBarController | UITabBarController 實(shí)現(xiàn)ASVisibility 協(xié)議。 |
示例代碼和特定示例項(xiàng)目在每個(gè)節(jié)點(diǎn)容器的文檔中突出顯示厉亏。
2.2: 通過(guò)使用節(jié)點(diǎn)容器獲得什么延蟹?
節(jié)點(diǎn)容器自動(dòng)管理其節(jié)點(diǎn)的智能預(yù)加載。這意味著所有節(jié)點(diǎn)的布局測(cè)量叶堆,數(shù)據(jù)讀取阱飘,解碼和渲染都將以異步方式完成。這就是為什么建議使用容器節(jié)點(diǎn)內(nèi)的節(jié)點(diǎn)的原因虱颗。
請(qǐng)注意沥匈,雖然可以直接使用節(jié)點(diǎn)(不使用Texture節(jié)點(diǎn)容器),除非添加其他調(diào)用忘渔,否則只有在屏幕上顯示時(shí)才會(huì)開(kāi)始顯示(如UIKit所做的那樣)高帖。 這可能導(dǎo)致性能下降和內(nèi)容閃爍。
三: Node Subclasses(節(jié)點(diǎn)子類)
Texture提供以下節(jié)點(diǎn)畦粮。
與UIKit組件相比散址,使用節(jié)點(diǎn)的一個(gè)關(guān)鍵優(yōu)勢(shì)是 突破了UIKit組件必須要在主線程進(jìn)行布局和顯示的限制,因此使用Texture
可以保證主線程可以及時(shí)響應(yīng)用戶交互事件宣赔。
Texture Node | UIKit Equivalent |
---|---|
ASDisplayNode | UIView 所有其他節(jié)點(diǎn)都從其繼承的根Texture節(jié)點(diǎn) |
ASCellNode | UITableViewCell & UICollectionViewCell ASCellNode用于ASTableNode预麸,ASCollectionNode和ASPagerNode |
ASScrollNode | UIScrollView 此節(jié)點(diǎn)對(duì)于創(chuàng)建包含其他節(jié)點(diǎn)的自定義可滾動(dòng)區(qū)域很有用 |
ASEditableTextNode | UITextView |
ASTextNode | UILabel |
ASImageNode、 ASNetworkImageNode儒将、 ASMultiplexImageNode | UIImage |
ASVideoNode | AVPlayerLayer |
ASVideoPlayerNode | UIMoviePlayer |
ASControlNode | UIControl |
ASButtonNode | UIButton |
ASMapNode | MKMapView |
Texure
無(wú)縫的對(duì)接UIKit吏祸,除此之外Texture
節(jié)點(diǎn)提供更高級(jí)的功能和便利。 例如钩蚊,ASNetworkImageNode
會(huì)自動(dòng)加載和緩存管理贡翘,甚至支持漸進(jìn)式j(luò)peg和動(dòng)畫gif蹈矮。
AsyncDisplayKitOverview示例應(yīng)用程序給出了上面列出的每個(gè)節(jié)點(diǎn)的基本實(shí)現(xiàn)。
三: Node Inheritance Hierarchy(節(jié)點(diǎn)繼承層次結(jié)構(gòu))
所有texture節(jié)點(diǎn)都從ASDisplayNode繼承鸣驱。
以藍(lán)色突出顯示的節(jié)點(diǎn)是UIKit元素的同步包裝泛鸟。例如,ASScrollNode
包裝一個(gè)UIScrollView
踊东,ASCollectionNode
包裝一個(gè)UICollectionView
北滥。 liveMapMode中的ASMapNode
是UIMapView
的同步包裝器。
四: Subclassing(子類)
創(chuàng)建子類時(shí)最重要的區(qū)別在于是ASViewController
還是ASDisplayNode
的子類递胧。這聽(tīng)起來(lái)很明顯,但由于其中的一些差異很微妙赡茸,因此一定注意區(qū)分缎脾。
4.1: ASDisplayNode
雖然子類化節(jié)點(diǎn)類似于編寫UIView子類,但還是有一些指導(dǎo)原則需要遵循占卧,以確保您充分利用該框架的潛力遗菠,并確保您的節(jié)點(diǎn)按預(yù)期行事。
4.1.1: -init
使用nodeBlocks
時(shí)华蜒,在后臺(tái)線程上調(diào)用此方法辙纬。但是,因?yàn)樵?init完成之前沒(méi)有其他方法可以運(yùn)行叭喜,所以在此方法中不應(yīng)該有鎖贺拣。
要記住的最重要的事情是你的init方法必須能夠在任何隊(duì)列上被調(diào)用。 最值得注意的是捂蕴,這意味著您不應(yīng)該初始化任何UIKit對(duì)象譬涡,觸摸節(jié)點(diǎn)的視圖或圖層(例如node.layer.X
或node.view.X
),或者在初始化程序中添加任何手勢(shì)識(shí)別器啥辨。 取而代之的是在-dldLoad
中執(zhí)行這些操作涡匀。
4.1.2: -didLoad
這個(gè)方法在概念上類似于UIViewController
的-viewDidLoad
方法;它被調(diào)用一次,并且是加載后臺(tái)視圖的點(diǎn)溉知。它可以保證在主線程中調(diào)用陨瘩,并且是執(zhí)行任何UIKit事物(例如添加手勢(shì)識(shí)別器,觸摸視圖/圖層级乍,初始化UIKit對(duì)象)的適當(dāng)位置舌劳。
4.1.3: -layoutSpecThatFits:
該方法定義了布局,并在后臺(tái)線程上執(zhí)行繁重的計(jì)算玫荣。此方法用于構(gòu)建將生成節(jié)點(diǎn)大小的布局規(guī)范對(duì)象蒿囤,以及所有子節(jié)點(diǎn)的大小和位置。 這是您將放置大部分布局代碼的地方崇决。
您創(chuàng)建的布局規(guī)范對(duì)象具有延展性材诽,直到它在此方法中返回為止底挫。 在這之后,它將是不可變的脸侥。 記住不要緩存布局規(guī)格供以后使用建邓,而是在必要時(shí)重新創(chuàng)建它們。
由于它在后臺(tái)線程上運(yùn)行睁枕,因此不應(yīng)在此處設(shè)置任何node.view或node.layer屬性官边。另外,除非您知道自己在做什么外遇,否則不要在此方法中創(chuàng)建任何節(jié)點(diǎn)注簿。此外,與其他方法覆蓋不同跳仿,調(diào)用super的方法并不是必需的诡渴。
4.1.4: -layout
在這種方法中super調(diào)用是layoutSpec的結(jié)果應(yīng)用的地方;在此方法調(diào)用super之后,布局規(guī)格將被計(jì)算并且所有子節(jié)點(diǎn)將被測(cè)量和定位菲语。
-layout在概念上與UIViewController
的-viewWillLayoutSubviews
類似妄辩。 這是更改隱藏屬性的好地方,如果需要(不可布局的屬性)設(shè)置基于視圖的屬性或設(shè)置背景顏色山上。 您可以將背景顏色設(shè)置放在-layoutSpecThatFits:
中眼耀,但可能存在計(jì)時(shí)問(wèn)題。 如果你碰巧使用任何UIViews佩憾,你可以在這里設(shè)置它們的框架哮伟。 但是,您始終可以使用-initWithViewBlock
創(chuàng)建節(jié)點(diǎn)包裝:然后在其他位置的后臺(tái)線程上調(diào)整大小妄帘。
這個(gè)方法在 主線程中調(diào)用澈吨。但是,如果您使用layout Specs
寄摆,您將不會(huì)過(guò)多依賴此方法谅辣,因?yàn)樽詈眠h(yuǎn)離主線程進(jìn)行布局。 除非使用1到10個(gè)子元素你可以使用這個(gè)方法婶恼。
對(duì)于你希望子節(jié)點(diǎn)成為你的確切大小的特定情況桑阶,一個(gè)很好的使用 -layout
布局。例如: 當(dāng)你想要一個(gè)collectionNode
占據(jù)整個(gè)屏幕,這種情況不受布局規(guī)范的支持勾邦,通常在這種方法中用一行手動(dòng)設(shè)置框架最簡(jiǎn)單:
subnode.frame = self.bounds;
如果你希望在ASViewController
中有同樣的效果蚣录,你可以在-viewWillLayoutSubviews
中做同樣的事情,除非你的節(jié)點(diǎn)是initWithNode
中的節(jié)點(diǎn):在這種情況下眷篇,它會(huì)自動(dòng)完成萎河。
4.2: ASViewController
ASViewController
是一個(gè)常規(guī)的UIViewController
子類,它具有管理節(jié)點(diǎn)的特殊功能。 由于它是一個(gè)UIViewController
子類虐杯,因此所有方法都在主線程上調(diào)用(并且您應(yīng)該始終在主線程上創(chuàng)建一個(gè)ASViewController
)
4.2.1:-init
該方法在ASViewController
生命周期的最初階段被調(diào)用一次玛歌。 和UIViewController
初始化一樣,最好的做法是不要在這個(gè)方法中訪問(wèn)self.view
或self.node.view
擎椰,因?yàn)樗鼤?huì)強(qiáng)制視圖被提前創(chuàng)建支子。 相反,在-viewDidLoad
中執(zhí)行任何視圖訪問(wèn)达舒。
ASViewController
的指定初始化程序是initWithNode :
一個(gè)典型的初始化程序看起來(lái)像下面的代碼值朋。請(qǐng)注意在調(diào)用super
之前如何創(chuàng)建ASViewController
的節(jié)點(diǎn)。 ASViewController
類似于UIViewController
管理視圖來(lái)管理節(jié)點(diǎn)巩搏,但初始化稍有不同昨登。
OC
- (instancetype)init
{
_pagerNode = [[ASPagerNode alloc] init];
self = [super initWithNode:_pagerNode];
// setup any instance variables or properties here
if (self) {
_pagerNode.dataSource = self;
_pagerNode.delegate = self;
}
return self;
}
swift
init() {
let pagerNode = ASPagerNode()
super.init(node: pagerNode)
pagerNode.setDataSource(self)
pagerNode.setDelegate(self)
}
4.2.2:-loadView
我們建議您不要使用這種方法,因?yàn)樗c-viewDidLoad
相比沒(méi)有什么特別的優(yōu)勢(shì)贯底,并且有一些缺點(diǎn)丰辣。 但是,只要不將self.view
屬性設(shè)置為不同的值丈甸,就可以安全使用糯俗。 對(duì)[super loadView]
的調(diào)用會(huì)將其設(shè)置為node.view
尿褪。
4.2.3: -viewDidLoad
這個(gè)方法在ASViewController
的生命周期中被調(diào)用一次睦擂,緊接在-loadView
之后。 這是您訪問(wèn)節(jié)點(diǎn)視圖的最早時(shí)間杖玲。 這是放置任何設(shè)置代碼的好地方顿仇,它只能運(yùn)行一次,并需要訪問(wèn)視圖/圖層摆马,例如添加手勢(shì)識(shí)別器臼闻。
布局代碼不應(yīng)該放在這個(gè)方法中,因?yàn)楫?dāng)視圖的幾何變化時(shí)它不會(huì)再被調(diào)用囤采。 注意這對(duì)UIViewController同樣適用;即使您目前不期望元素的幾何變化述呐,在此方法中放置布局代碼也是不好的做法。
4.2.4 -viewWillLayoutSubviews
該方法在與節(jié)點(diǎn)的-layout
方法完全相同的時(shí)間被調(diào)用蕉毯,并且可以在ASViewController
的生命周期中多次調(diào)用該方法; 只要ASViewController
節(jié)點(diǎn)的邊界發(fā)生變化(包括旋轉(zhuǎn)乓搬,分割屏幕,鍵盤顯示)以及層次結(jié)構(gòu)發(fā)生變化(兒童被添加代虾,刪除或更改大薪稀),就會(huì)調(diào)用它棉磨。
為了一致性江掩,最好的做法是將所有布局代碼放入此方法中。因?yàn)樗皇欠浅nl繁地調(diào)用,所以即使代碼不直接依賴于大小环形,也屬于這里策泣。
4.2.5 -viewWillAppear: / -viewDidDisappear:
這些方法在ASViewController
的節(jié)點(diǎn)出現(xiàn)在屏幕上(最早可見(jiàn)時(shí))以及從視圖層次結(jié)構(gòu)(最早不再可見(jiàn)的時(shí)間)之后立即調(diào)用。 這些方法提供了一個(gè)很好的機(jī)會(huì)來(lái)啟動(dòng)或停止與呈現(xiàn)或解除控制器相關(guān)的動(dòng)畫斟赚。 這也是一個(gè)記錄用戶操作的好地方着降。
盡管這些方法可能被多次調(diào)用,并且?guī)缀涡畔⒖捎棉志鼈儾粫?huì)被調(diào)用用于所有幾何變化任洞,因此不應(yīng)該用于核心布局代碼(超出特定動(dòng)畫所需的設(shè)置)。
五: FAQ
5.1: 常見(jiàn)的開(kāi)發(fā)者錯(cuò)誤
- 1: 不要在
-init:
中訪問(wèn)節(jié)點(diǎn)的視圖发侵。 - 2: 確保您訪問(wèn)
nodeBlock
外部的數(shù)據(jù)源交掏。 - 3: 采取措施避免
viewBlocks
中的保留周期。
5.2: 常見(jiàn)的概念誤解
- 1:
ASCellNodes
不可重用刃鳄。 - 2: 布局規(guī)格每次調(diào)用布局時(shí)都會(huì)重新生成盅弛。
- 3: 我們強(qiáng)大的
Layout API
中使用的所有尺寸之間的差異。
5.3: 常見(jiàn)問(wèn)題
- 如果您關(guān)心性能叔锐,請(qǐng)勿使用
CALayer
的.cornerRadius
屬性(或shadowPath
挪鹏,邊框
或遮罩
)。 -
Texture
不支持UIKit自動(dòng)布局愉烙。 - 我可以在
Texture
中使用我的UICollectionViewCells
嗎讨盒? -
ASDisplayNode
保持活動(dòng)參考。
在加載之前訪問(wèn)節(jié)點(diǎn)的視圖
Node的-init
方法通常非主線程被調(diào)用步责,因此必須不要訪問(wèn)UIKit對(duì)象返顺。常見(jiàn)錯(cuò)誤的示例包括訪問(wèn)節(jié)點(diǎn)的視圖或創(chuàng)建手勢(shì)識(shí)別器。取而代之的是, 這些操作非常適合在-dldLoad
中執(zhí)行蔓肯。
確保您訪問(wèn)節(jié)點(diǎn)塊外的數(shù)據(jù)源
indexPath
參數(shù)僅在nodeBlockForItemAtIndexPath:
或nodeBlockForRowAtIndexPath:
中返回的節(jié)點(diǎn)塊外有效遂鹊。由于這些塊是在后臺(tái)線程上執(zhí)行的,由于數(shù)據(jù)源中的其他更改蔗包,indexPath可能會(huì)因執(zhí)行時(shí)間而無(wú)效
查看如何在ASTableNode
頁(yè)面中正確編碼節(jié)點(diǎn)塊的示例秉扑。就像使用UIKit
一樣,如果從任何ASCellNode
的塊返回Nil
调限,它將導(dǎo)致異常舟陆。
采取措施避免viewBlocks中的保留周期
使用initWithViewBlock
時(shí):通過(guò)捕獲對(duì)自身的強(qiáng)引用來(lái)防止保留周期很重要. 循環(huán)可以創(chuàng)建的兩種方式是使用塊內(nèi)的任何實(shí)例變量或直接引用自身而不使用弱指針
只要通過(guò)指向自我的弱指針訪問(wèn)屬性,就可以使用屬性而不是實(shí)例變量旧噪。
因?yàn)?code>viewBlocks總是在主線程上執(zhí)行吨娜,所以執(zhí)行UIKit操作(包括手勢(shì)識(shí)別器的創(chuàng)建和添加)是安全的。
雖然該塊在創(chuàng)建視圖后被銷毀淘钟,但如果該塊從未運(yùn)行并且該視圖永遠(yuǎn)不會(huì)創(chuàng)建宦赠,那么一個(gè)循環(huán)可以持續(xù),防止釋放內(nèi)存。
ASCellNode可重用性
Texture
不使用單元重用勾扭,由于許多特定的原因毡琉,其中一個(gè)副作用就是消除了與細(xì)胞再利用相關(guān)的大量錯(cuò)誤。
重新生成LayoutSpecs
每次調(diào)用layoutThatFits:
方法時(shí)妙色,都會(huì)重新生成一個(gè)節(jié)點(diǎn)的layoutSpec
布局API大小調(diào)整
如果您對(duì)ASRelativeDimension
桅滋,ASRelativeSize
,ASRelativeSizeRange
和ASSizeRange
感到困惑身辨,請(qǐng)查看我們的Layout API
調(diào)整指南丐谋。
CALayer的.cornerRadius屬性殺死性能
CALayer
的.cornerRadius
屬性是一個(gè)災(zāi)難性的昂貴的屬性,只能在沒(méi)有其他選擇的情況下使用.
它是CALayer上效率最低煌珊,渲染密集度最高的屬性之一(與shadowPath
号俐,遮罩
,邊框
等一起,
這些屬性會(huì)觸發(fā)離屏渲染定庵,以在每個(gè)幀上執(zhí)行剪裁操作.滾動(dòng)期間60FPS吏饿! - 即使該區(qū)域的內(nèi)容沒(méi)有變化。
使用cornerRadius
會(huì)在iPhone 4
蔬浙,4S
和5 / 5C
(以及可比的iPad / iPod
)上視覺(jué)上降低性能猪落,并降低頭部空間,并使5S和更新設(shè)備上的幀丟失更可能畴博。
如需更長(zhǎng)時(shí)間的討論和簡(jiǎn)單的替代圓角解決方案笨忌,請(qǐng)閱讀我們?nèi)娴?a target="_blank">圓角圓角指南。
紋理不支持UIKit Auto Layout或InterfaceBuilder
Texture不支持UIKit Auto Layout
和InterfaceBuilder
绎晃。值得注意的是蜜唾,這些技術(shù)都不允許在已建立和有紀(jì)律的iOS開(kāi)發(fā)團(tuán)隊(duì)中使用杂曲,例如Facebook
庶艾,Instagram
和Pinterest
但是,Texture
的Layout API提供了各種ASLayoutSpec object擎勘,允許實(shí)現(xiàn)更高效的自動(dòng)布局(多線程咱揍,離開(kāi)主線程), 更易于調(diào)試(可以進(jìn)入代碼并查看所有值來(lái)自哪里,因?yàn)樗情_(kāi)源的)棚饵,并且可重用(可以構(gòu)建可與UI的不同部分共享的可組合布局)煤裙。
ASDisplayNode保持活動(dòng)參考
該保留周期是故意創(chuàng)建的,因?yàn)楣?jié)點(diǎn)處于“活動(dòng)”視圖層次結(jié)構(gòu)中(它位于屏幕上的UIWindow內(nèi))噪漾。
要明白為什么這是必要的硼砰,請(qǐng)考慮Apple也在UIView和CALayer之間創(chuàng)建了這個(gè)保留循環(huán),如果您創(chuàng)建一個(gè)UIView并將其圖層添加到一個(gè)超級(jí)圖層,然后釋放UIView欣硼,它將保持活動(dòng)狀態(tài)题翰,即使指向它的CALayer委托很弱
出于同樣的原因,如果節(jié)點(diǎn)的視圖是窗口的后代,但沒(méi)有對(duì)節(jié)點(diǎn)的引用豹障,我們使節(jié)點(diǎn)保持活動(dòng)狀態(tài)冯事,并從視圖中引用強(qiáng)引用。
良好的應(yīng)用程序設(shè)計(jì)不應(yīng)該依賴這種行為血公,因?yàn)閷?duì)節(jié)點(diǎn)的強(qiáng)引用應(yīng)該由子節(jié)點(diǎn)數(shù)組或?qū)嵗兞烤S護(hù)昵仅。 但是,這種情況偶爾會(huì)發(fā)生累魔,例如使用UIView動(dòng)畫API時(shí)摔笤。這個(gè)循環(huán)不應(yīng)該造成泄漏,甚至不會(huì)延長(zhǎng)節(jié)點(diǎn)的生命周期垦写,而不會(huì)超過(guò)絕對(duì)必要的時(shí)間籍茧。
UICollectionViewCell兼容性
Texture支持使用UICollectionViewCells
和本地ASCellNodes
。
請(qǐng)注意梯澜,即使在同一個(gè)ASCollectionNode
中混合使用寞冯,這些UIKit單元也不具備ASCellNodes的性能優(yōu)勢(shì)(如預(yù)加載,異步布局和異步繪制)晚伙。
但是吮龄,這種互操作性使開(kāi)發(fā)人員能夠靈活地測(cè)試出框架,而無(wú)需一次轉(zhuǎn)換所有的單元咆疗。在這里閱讀更多漓帚。
iOS 開(kāi)發(fā)一定要嘗試的 Texture(ASDK)
Texture 布局篇
iOS性能優(yōu)化探討
新大陸:AsyncDisplayKit
預(yù)加載與智能預(yù)加載(iOS)
AsyncDisplayKit 2.0 Tutorial: Getting Started
AsyncDisplayKit 2.0 Tutorial: Automatic Layout