ASDK的核心概念(三)

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ò)程中更新跌造。

接口狀態(tài)范圍

節(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)整它們伟姐。


image

在上述滾動(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
ASImageNodeASNetworkImageNode儒将、 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繼承鸣驱。

Node Inheritance Hierarchy

以藍(lán)色突出顯示的節(jié)點(diǎn)是UIKit元素的同步包裝泛鸟。例如,ASScrollNode包裝一個(gè)UIScrollView踊东,ASCollectionNode包裝一個(gè)UICollectionView北滥。 liveMapMode中的ASMapNodeUIMapView的同步包裝器。

四: 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.Xnode.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.viewself.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桅滋,ASRelativeSizeASRelativeSizeRangeASSizeRange感到困惑身辨,請(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蔬浙,4S5 / 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 LayoutInterfaceBuilder绎晃。值得注意的是蜜唾,這些技術(shù)都不允許在已建立和有紀(jì)律的iOS開(kāi)發(fā)團(tuán)隊(duì)中使用杂曲,例如Facebook庶艾,InstagramPinterest

但是,TextureLayout 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市午磁,隨后出現(xiàn)的幾起案子尝抖,更是在濱河造成了極大的恐慌,老刑警劉巖迅皇,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧辽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡登颓,警方通過(guò)查閱死者的電腦和手機(jī)搅荞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)框咙,“玉大人咕痛,你說(shuō)我怎么就攤上這事±觯” “怎么了茉贡?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)者铜。 經(jīng)常有香客問(wèn)我腔丧,道長(zhǎng)构蹬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任悔据,我火速辦了婚禮庄敛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘科汗。我一直安慰自己藻烤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布头滔。 她就那樣靜靜地躺著怖亭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坤检。 梳的紋絲不亂的頭發(fā)上兴猩,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音早歇,去河邊找鬼倾芝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箭跳,可吹牛的內(nèi)容都是我干的晨另。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谱姓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼借尿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起屉来,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤路翻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后茄靠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茂契,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年嘹黔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了账嚎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莫瞬。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儡蔓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疼邀,到底是詐尸還是另有隱情喂江,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布旁振,位于F島的核電站获询,受9級(jí)特大地震影響涨岁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吉嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一梢薪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尝哆,春花似錦秉撇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至恒序,卻和暖如春瘦麸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歧胁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工滋饲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊巍。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓了赌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玄糟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勿她,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一: 智能預(yù)加載二: Node Containers三: Node Subclasses四: Subclassi...
    iYeso閱讀 966評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,113評(píng)論 1 32
  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 3,878評(píng)論 1 22
  • 探討的幾個(gè)點(diǎn) Texture的簡(jiǎn)介 (What) 為什么要使用Texture (Why) Texture的作者 (...
    SuperBoy_Timmy閱讀 5,835評(píng)論 5 45
  • 談?wù)?MVX 中的 Model 談?wù)?MVX 中的 View 談?wù)?MVX 中的 Controller 淺談 MV...
    Draveness閱讀 952評(píng)論 0 7