AsyncDisplayKit - 加快 UI 響應性能
AsyncDisplayKit 是 非死book 推出的一個開源庫, 主要針對于最大化 UI 的響應速度。
關于 AsyncDisplayKit
AsyncDisplayKit 是 非死book 開發 Paper 的團隊項目中產出的副產品。 雖然 Paper 這個項目沒能取得預期的成績, 但卻留下了 AsyncDisplayKit 這個開源庫。 AsyncDisplayKit 主要用于加快 iOS app 中 UI 相應的性能。
iOS 本身對 UI 響應速度的優化做的非常好, 比如通過 RunLoop 來控制主線程的優先級, 優先響應用戶操作。 這一點大家在拖動諸如 UITableView 這類的控件時可能會注意到,假如你在拖動的時候同時在后臺請求圖片之類的數據, 在你放手之前, 這些后臺網絡請求會被阻塞。 這也是 iOS 對于 UI 響應做的一個優化。 這個優化是通過 UITrackingRunLoopMode 做到的。
再回到 AsyncDisplayKit , 它對 iOS 的 UI 響應做了進一步優化。 其中一個特點就是允許在 非主線程操作 UI 控件 。 是的,你沒看錯。 必須在主線程操作 UI 控件這個概念幾乎成了 iOS 以及大多數客戶端開發的定律。如果在 iOS 中的非主線程操作 UI, 就會導致一系列奇怪的結果,甚至造成應用 Crash。
不過, AsyncDisplayKit 確實能夠提供這個能力。 這樣你就可以讓主線程更加有效率。 比如,你可以將 UIImage 加載圖片的操作放到異步線程中, 并且在這個異步線程中設置圖片, 調整 UI 組件的 frame 等等。
那么 AsyncDisplayKit 是怎么能做到呢? 它依然運用的是 RunLoop 上的特性。
使用 AsyncDisplayKit
AsyncDisplayKit 可以通過 Carthage 集成, 編輯 Cartfile:
github "非死book/AsyncDisplayKit"
然后運行:
carthage update
集成完畢后, 就可以在項目中使用了, 如果使用 Swift, 首先需要在 BridgingHeader 中引入:
#import <AsyncDisplayKit/AsyncDisplayKit.h>
AsyncDisplayKit 針對 UIKit 的每一個控件都定義了對應的封裝, ASImageNode 對應 UIImageView 。 完整的對應關系可以參考這張圖:
從圖中可以看出, AsyncDisplayKit 將 View 映射成了 Node , 比如我們要在 UI 上面顯示一個圖片, 可以這樣:
class ViewController: ASViewController<ASDisplayNode> {
override func viewDidLoad() {
super.viewDidLoad()
let imageNode = ASImageNode()
self.view.addSubnode(imageNode)
DispatchQueue.global().async {
imageNode.image = UIImage(named: "icon")
imageNode.frame = CGRect(x: 100, y: 100, width: 150, height: 150)
}
}
}
這里為了簡化,將異步線程的代碼寫在里一起。 我們在主線程中創建了 ASImageNode 然后將它添加到了視圖結構中, 注意使用的是 addSubnode 方法。 大家仔細看一下,可以發現我們的 ViewController 繼承自 ASViewController 。
AsyncDisplayKit 還對控制器做了處理。 我們需要使用這些控制器才能開啟 AsyncDisplayKit 的全部特性。
接下來我們用了一個 DispatchQueue 異步的加載圖片,并設置 ImageNode 的 frame , 這些都是在異步線程進行的。
運行程序你會發現一切都正常的執行了。 并沒有因為在異步線程操作 UI 而產生問題。 至于 AsyncDisplayKit 是如何做到這一點的, 前面給大家推薦的文章中詳細的做了講解。
智能預加載
智能預加載是我翻譯過來的名字, 原名叫做 Intelligent Preloading , 是 AsyncDisplayKit 針對類似 UIScrollView, UITableView 這些可滑動的組件做的一個優化。 Intelligent Preloading 也是充分運用 AsyncDisplayKit 的異步 UI 操作能力,在視圖上下滑動的時候,進行一些更加優化的動態處理。 因為我們開發的大多數 App 都會用到諸如 UITableView 這樣的滑動組件,所以這個特性對于我們開發的 App 還是很有幫助的。
結語
以上就是對 AsyncDisplayKit 給大家做的簡要介紹了,它提供的這些特性對于提升 App 的 UI 性能還是比較有幫助的。 如果你的 App 正面臨這方面的問題, 不妨可以試一下 AsyncDisplayKit 。 當然,它的全部特性還是比較復雜的, 這里面給大家只做了一個簡要的介紹。
來自:http://www.swiftcafe.io/2016/12/12/asdk/