13.4 異步繪制

2018-02-24 15:07 更新

異步繪制

????UIKit的單線程天性意味著寄宿圖通暢要在主線程上更新,這意味著繪制會(huì)打斷用戶交互,甚至讓整個(gè)app看起來處于無響應(yīng)狀態(tài)。我們對(duì)此無能為力,但是如果能避免用戶等待繪制完成就好多了。

????針對(duì)這個(gè)問題,有一些方法可以用到:一些情況下,我們可以推測(cè)性地提前在另外一個(gè)線程上繪制內(nèi)容,然后將由此繪出的圖片直接設(shè)置為圖層的內(nèi)容。這實(shí)現(xiàn)起來可能不是很方便,但是在特定情況下是可行的。Core Animation提供了一些選擇:CATiledLayerdrawsAsynchronously屬性。

CATiledLayer

????我們?cè)诘诹潞唵翁剿髁艘幌?code>CATiledLayer。除了將圖層再次分割成獨(dú)立更新的小塊(類似于臟矩形自動(dòng)更新的概念),CATiledLayer還有一個(gè)有趣的特性:在多個(gè)線程中為每個(gè)小塊同時(shí)調(diào)用-drawLayer:inContext:方法。這就避免了阻塞用戶交互而且能夠利用多核心新片來更快地繪制。只有一個(gè)小塊的CATiledLayer是實(shí)現(xiàn)異步更新圖片視圖的簡單方法。

drawsAsynchronously

????iOS 6中,蘋果為CALayer引入了這個(gè)令人好奇的屬性,drawsAsynchronously屬性對(duì)傳入-drawLayer:inContext:的CGContext進(jìn)行改動(dòng),允許CGContext延緩繪制命令的執(zhí)行以至于不阻塞用戶交互。

????它與CATiledLayer使用的異步繪制并不相同。它自己的-drawLayer:inContext:方法只會(huì)在主線程調(diào)用,但是CGContext并不等待每個(gè)繪制命令的結(jié)束。相反地,它會(huì)將命令加入隊(duì)列,當(dāng)方法返回時(shí),在后臺(tái)線程逐個(gè)執(zhí)行真正的繪制。

????根據(jù)蘋果的說法。這個(gè)特性在需要頻繁重繪的視圖上效果最好(比如我們的繪圖應(yīng)用,或者諸如UITableViewCell之類的),對(duì)那些只繪制一次或很少重繪的圖層內(nèi)容來說沒什么太大的幫助。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)