Texture的基本元素是node.ASDisplayNode是對(duì)UIView的抽象递递,而UIView又是對(duì)CALayer的抽象。與views只能在主線程使用不同,nodes是線程安全的:可以在后臺(tái)線程并行的創(chuàng)建實(shí)例,以及構(gòu)建整個(gè)node層次.
iOS的一個(gè)黃金準(zhǔn)則是:要保證你的用戶界面操作平滑與及時(shí)響應(yīng),你的app必須保證每秒60幀的刷新頻率.這意味著在主線程上只有1/60秒的時(shí)間來處理每一幀.也就是說只有16毫秒的時(shí)間來執(zhí)行布局與渲染操作的代碼.并且因?yàn)榇嬖谙到y(tǒng)的額外開銷,你的代碼通常只有在10毫秒之內(nèi)執(zhí)行完畢,才不會(huì)導(dǎo)致丟幀.
Texture能讓你把圖片解碼,文本大小計(jì)算與渲染,和其他開銷較大的UI操作剝離出主線程,讓主線程能夠?qū)换ビ屑皶r(shí)的響應(yīng).當(dāng)然Texture還有不少優(yōu)點(diǎn),不過我們之后才會(huì)提到.
Nodes
如果你熟悉views,那你已經(jīng)知道怎么使用nodes.node提供了UIView和UILayer大部分方法和屬性的同名實(shí)現(xiàn).在少數(shù)UIView和CALayer有(功能相同)命名差異的場(chǎng)景(例如view.clipsToBounds對(duì)于layer.masksToBounds),nodes默認(rèn)使用UIView的命名.有一個(gè)例外就是nodes使用position來替代center這個(gè)屬性.
你也可以直接訪問node內(nèi)部的view或者layer.例如node.view或者node.layer.但要確保是在主線程進(jìn)行操作.
Texture對(duì)大部分常用的UIKit組件提供了可供替代的node類型.即便是大型應(yīng)用也可以完全使用nodes來進(jìn)行他們的UI開發(fā).
Node Containers
剛開始在項(xiàng)目中使用Texture時(shí),一個(gè)很常見的錯(cuò)誤就是將nodes直接加入已經(jīng)存在的view層級(jí)中.這么做有很大概率會(huì)造成nodes在渲染時(shí)發(fā)生閃爍.(理由后面會(huì)講)
正確的方式是將nodes以subnodes的方式添加到node container中.node container負(fù)責(zé)管理這些subnodes當(dāng)下所處的狀態(tài),以此來盡可能的提升數(shù)據(jù)加載和nodes渲染的效率.你可以把這些container看成是連接UIKit和Texture的橋梁.
布局引擎
Texture的布局引擎既是其最強(qiáng)大的功能之一,也是其最獨(dú)特的功能之一.它基于CSS FlexBox模型,提供了一種可描述的方式(聲明式)來指定自定義nodes的大小和subnodes的布局.在所有nodes并行渲染時(shí),通過為每個(gè)node提供ASLayoutSpec的方式,進(jìn)行異步的尺寸計(jì)算和布局.
高級(jí)開發(fā)者功能
Texture提供豐富的,UIKit和Foundation不具備的高級(jí)開發(fā)者功能.
我們的開發(fā)者會(huì)發(fā)現(xiàn), Texture讓他們的app架構(gòu)更簡(jiǎn)單,并且能提高開發(fā)者的開發(fā)速度.
將Texture添加到你的應(yīng)用中
如果你第一次接觸Texture,我們建議你看看ASDKgram這個(gè)demo.我們正準(zhǔn)備提供關(guān)于"如何添加Texture到應(yīng)用"的小白手冊(cè)(step-by-step)和demo(can follow along).(然而還沒做好)
如果您遇到任何問題,請(qǐng)到我們的GitHub或者Texture Slack社區(qū)尋求幫助.