深入淺出Texture--高性能界面的解決方案

Texture是由Facebook開源的AsyncDisplayKit演變而來

特性

Texture的基礎單元是一個個node,ASDisplayNode是基于CALayer的一層抽象。不同于UIView對象,ASDisplayNode是線程安全的,它不僅僅可以用于主線程而且可以在輔線程中使用。

使用Texture可以讓我們在輔線程中進行圖片的解析、文本的適應、約束等等UI操作,從而能夠保證主線程及時對用戶的操作做出反應

常用類

  • ASViewController: 基于UIViewController封裝的子類,能夠方便的為我們提供node的管理
  • ASNavigationController: 可用于替代UINavigationController,遵循ASVisibility協(xié)議
  • ASTabBarController: 可用于替代UITabBarController,遵循ASVisiblity協(xié)議
  • ASCollectionNode、ASTableNode:等同于UICollectionView、UITableView
  • ASPagerNode:基于ASCollectionNode封裝的子類,能夠像UIPageViewController一樣給我們提供強大的滑動操作體驗
  • ASCellNode:等同于UITableViewCell、UICollectionViewCell,需要強調(diào)的是它返回的是一個Block(ASCellNodeBlock)。
  • ASScrollNode: 代替UIScrollView
  • ASEditableTextNode: 代替UITextView
  • ASTextNode: 代替UILabel
  • ASImageNode: 代替UIImage
  • ASNetworkImageNode: 可以自動加載圖片并進行內(nèi)存管理,而且還支持逐步加載Jpeg和動態(tài)gif圖片
  • ASMultiplexImageNode:
  • ASVideoNode: 代替AVPlayerLayer
  • ASVideoPlayerNode: 代替UIMoviePlayer
  • ASControlNode: 代替UIControl
  • ASButtonNode: 代替UIButton
  • ASMapNode: 代替MKMapView
  • ASStackLayoutSpec: 堆放布局規(guī)則
  • ASOverlayLayoutSpec: 覆蓋布局規(guī)則
  • ASRelativeLayoutSpec: 相對布局規(guī)則
  • ASInsetLayoutSpec: 插入布局規(guī)則
  • ASBackgroundLayoutSpec: 背景布局規(guī)則
  • ASCenterLayoutSpec: 中心布局規(guī)則
  • ASAbsoluteLayoutSpec: 絕對布局規(guī)則
  • ASRatioLayoutSpec: 比例布局規(guī)則

層級結(jié)構(gòu)

graph TB
ASDisplayNode-->ASTableNode
ASDisplayNode-->ASCollectionNode
ASDisplayNode-->ASCellNode
ASDisplayNode-->ASScrollNode
ASDisplayNode-->ASEditableTextNode
ASDisplayNode-->ASControlNode
ASCollectionNode-->ASPagerNode
ASControlNode-->ASButtonNode
ASControlNode-->ASTextNode
ASControlNode-->ASMapNode
ASControlNode-->ASImageNode
ASImageNode-->ASNetworkImageNode
ASImageNode-->ASMultiplexImageNode
ASNetworkImageNode-->ASVideoNode

批抓取進行無限滾動

// 將leadingScreensForBatching 設置為1.0表示當滾動到還剩下一個全屏時就開始抓取新的一批數(shù)據(jù)
self.tableNode.view.leadingScreensForBatching = 1.0; 
- (BOOL)shouldBatchFetchForTableNode:(ASTableNode *)tableNode {
    return YES;
}

ASDK的容器

當在項目中替換使用AsyncDisplayKit的時候,應該把nodes節(jié)點,當做一個子節(jié)點添加到一個容器類里,這些容器類負責告訴所包含的節(jié)點,他們現(xiàn)在是什么狀態(tài),以便盡可能有效的加載數(shù)據(jù)和渲染,經(jīng)常犯的一個錯誤是把node節(jié)點直接添加到一個現(xiàn)有的view中,這樣做會導致節(jié)點在渲染的時候會閃爍一下。

Texture為我們提供了以下這些節(jié)點容器:

  • ASCollectionNode
  • ASPagerNode
  • ASTableNode
  • ASViewController
  • ASNavigationController
  • ASTabBarController

使用節(jié)點容器的好處

節(jié)點容器能夠自動為它的節(jié)點們管理高效的預加載,這就意味著節(jié)點容器中所有的節(jié)點的尺寸約束、數(shù)據(jù)請求、圖片解析、渲染都將是異步進行

核心機制

Texture模擬了Core Animation的機制,所有針對ASNode的修改和提交,總有些任務是必需放在主線程執(zhí)行的,當這種任務出現(xiàn)的時候,ASNode就會把任務用ASAsyncTransaction(Group)封裝并提交到一個全局的容器去。Texture在RunLoop中注冊了一個Observer,監(jiān)視的事件和CA一樣,但是優(yōu)先級比CA低。當RunLoop進入休眠前,CA處理完事件后,ASDK就會執(zhí)行該loop內(nèi)提交的所有任務

利用這個機制,Texture可以在合適的機會把異步、并發(fā)的操作同步到主線程去,并且獲得不錯的性能

用法

  1. 利用ASTableNode替代UITableView創(chuàng)建一個高性能的列表頁面

  2. 利用ASLayoutSpec替代AutoLayout創(chuàng)建高效的頁面約束


歡迎訪問我的個人博客

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容