




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
/冷信號和熱信號底層實現(xiàn)分析前言由于最近在寫關(guān)于底層實現(xiàn)分析的文章,當(dāng)然也逃不了關(guān)于冷熱信號操作的分析。這篇文章打算分析分析如何從冷信號轉(zhuǎn)成熱信號的底層實現(xiàn)。目錄1.關(guān)于冷信號和熱信號的概念2熱信號3冷信號4.冷信號是如何轉(zhuǎn)換成熱信號的一.關(guān)于冷信號和熱信號的概念冷熱信號的概念是源自于源于框架()中的和,是主動的,盡管你并沒有訂閱事件,但是它會時刻推送,就像鼠標(biāo)移動;而是被動的,只有當(dāng)你訂閱的時候,它才會發(fā)布消息。可以有多個訂閱者,是一對多,集合可以及訂閱者共享信息;而只能一對一,當(dāng)有不同的訂閱者,消息是重新完整發(fā)送。熱信號是主動的,即使你沒有訂閱事件,它仍然會時刻推送。而冷信號是被動的,只有當(dāng)你訂閱的時候,它才會發(fā)送消息。熱信號可以有多個訂閱者,是一對多,信號可以及訂閱者共享信息。而冷信號只能一對一,當(dāng)有不同的訂閱者,消息會從新完整發(fā)送。二.熱信號家族中符合熱信號的特點的信號有以下幾個。1:<>(,,)*;(,,)*;-():((^)(<>));+();首先來看看的定義。是繼承自,并且它還遵守協(xié)議。這就意味著它既能訂閱信號,也能發(fā)送信號。在里面有一個數(shù)組,里面裝著該信號的所有訂閱者。其次還有一個信號,里面裝著該信號所有訂閱者的。之所以能稱之為熱信號,那么它肯定是符合上述熱信號的定義的。讓我們從它的實現(xiàn)來看看它是如何符合的。-(*):(<>){();*=[];=[[]];*=;(){[];}[:^{(){=[:^(<>,,*){;}];()[];}}];}上面是的實現(xiàn),它和最大的不同在這兩行*=;(){[];}把它的所有訂閱者全部都保存到了的數(shù)組里。既然保存了所有的訂閱者,那么,,就需要發(fā)生改變。-():(){[:^(<>){[];}];}-():(*){[];[:^(<>){[];}];}-(){[];[:^(<>){[];}];}從源碼可以看到,中的,,都會執(zhí)行:方法。-():((^)(<>)){*;(){=[];}(<>){();}}:方法會取出所有的訂閱者,依次調(diào)用入?yún)⒌?)方法。關(guān)于的訂閱和發(fā)送的流程可以參考第一篇文章,大體一致,其他的不同就是會依次對自己的訂閱者發(fā)送信號。就滿足了熱信號的特點,它即使沒有訂閱者,因為自己繼承了協(xié)議,所以自己本身就可以發(fā)送信號。冷信號只能被訂閱了才能發(fā)送信號。可以有很多訂閱者,它也會把這些訂閱者都保存到自己的數(shù)組里。之后再發(fā)送信號,訂閱者就如同一起看電視,播放過的節(jié)目就看不到了,發(fā)送過的信號也接收不到了。接收信號。而發(fā)送信號,訂閱者接收信號都只能從頭開始接受,如同看點播節(jié)目,每次看都從頭開始看。2.:(,,)<>;+():(<>);先看看的定義。是在這個方法里面被用到的。-(*):(<>(^)()):((^)())在這個方法里面,里面最后里面是由發(fā)送信號。[?(x):x];關(guān)于的詳細(xì)分析請看這篇文章3.:(,);+():();這個信號里面存儲了一個對象,這里存儲著這個信號的最新的值。當(dāng)然也可以調(diào)用類方法+():(){*=[];=;;}在這個方法里面存儲默認(rèn)的值,如果沒有接受到任何值,那么這個信號就會發(fā)送這個默認(rèn)的值。當(dāng)被訂閱:-(*):(<>){*=[];*=[:^{(){[];}}];[:^{[];[];}];}里面會始終發(fā)送存儲的值。調(diào)用會調(diào)用里面的,也會依次發(fā)送信號值給訂閱數(shù)組里面每個訂閱者。當(dāng)向訂閱者的時候:-():(){(){=;[];}}會把發(fā)送的值更新到里面。下次發(fā)送值就會發(fā)送最后更新的值。4.=;:(,,);(,,)*;(,);(,);(,)*;+():();中會存儲大小的歷史值。+():(){[(*)[]];}-(){[];}-():(){=[];();=;=(?[]:[]);;}在初始化中會初始化一個大小的數(shù)組。-(*):(<>){*=[];*=[:^{(){(){();[:(?:)];}();(){[];}(){[];}{*=[];[];}}}];[];;}當(dāng)被訂閱的時候,會把數(shù)組里面的值都發(fā)送出去。-():(){(){[?:];[];(>){[(0,-)];}}}在中,會保存每次接收到的值。調(diào)用的,會依次把值都發(fā)送到每個訂閱者中。這里還會判斷數(shù)組里面存儲了多少個值。如果存儲的值的個數(shù)大于了,那么要移除掉數(shù)組里面從0開始的前幾個值,保證數(shù)組里面只裝個數(shù)的值。和的區(qū)別在于,還會把歷史的信號值都存儲起來發(fā)送給訂閱者。這一點,更像是和的合體版。是冷信號,一旦被訂閱就會向訂閱者發(fā)送所有的值,這一點和是一樣的。但是又有著的特性,會把所有的值發(fā)送給多個訂閱者。當(dāng)發(fā)送完之前存儲的歷史值之后,之后再發(fā)送信號的行為就和完全一致了。三.冷信號在v2.5中除了信號以外,還有一些特殊的冷信號。1:+(*);這個信號只有一個方法。+(*){[[[]]""];;;(,^{=[[]];});;}在模式下,返回一個名字叫的信號。在模式下,返回一個單例的信號。-(*):(<>){();[:^{[];}];}信號一旦被訂閱就會發(fā)送。2.:(,,);+(*):();信號的定義也很簡單,直接根據(jù)的值返回一個。+(*):(){(){*;;(,^{=[[]];>=;});;}(){*;;(,^{=[[]];>=;});;}*=[[]];>=;[":",];;}在模式下直接新建一個信號里面的值存儲的是入?yún)ⅰT谀J较拢瑫勒盏闹凳欠袷强眨瑏硇陆▽?yīng)的單例。-(*):(<>){();[:^{[];[];}];}在被訂閱的時候,就只會發(fā)送一個值的信號,發(fā)送完畢之后就。3.這個信號是創(chuàng)建:的真身。關(guān)于詳細(xì)過程請看第一篇文章。4.:(,,)*;+(*):(*);信號里面就存儲了一個。+(*):(*){*=[[]];>=;[":",];=@":";;}初始化的時候把外界傳進(jìn)來的保存起來。當(dāng)被訂閱的時候就發(fā)送這個出去。5.:<>-()((("a")));(,,)*;(,,)<>;-():(*):(<>);在日常開發(fā)中,用來雙向綁定的。它和一樣,既繼承自,同樣又遵守協(xié)議。雖然具有的發(fā)送和接收信號的特性,但是它依舊是冷信號,因為它無法一對多,它發(fā)送信號還是只能一對一。無法手動初始化,需要靠去初始化。-(){=[];();*=[[:0]""];*=[[:1]""];[[]];[[]];=[[[]]""];=[[[]]""];;}在的初始化中會調(diào)用的:方法,這里的入?yún)⒍际穷愋偷摹K杂嗛嗊^程的時候:-(*):(<>){[];}其實就是一個,就相當(dāng)于訂閱。訂閱過程同上面的訂閱過程。-():(){[];}-():(*){[];}-(){[];}也是類型的,管道兩邊都是類型的信號。當(dāng)開始,,是調(diào)用的管道另外一個的進(jìn)行這些對應(yīng)的操作的。平時使用的地方在和的雙向綁定上面。例如在登錄界面,輸入密碼文本框和的雙向綁定*=[];*=(,136);[];[];雙向綁定的兩個信號都會因為對方的改變而收到新的信號。至此所有的的分類就都理順了,按照冷信號和熱信號的分類也分好了。根據(jù)訂閱和發(fā)送信號的流程,我們可以知道,每訂閱一次冷信號,就會執(zhí)行一次閉包。這個時候就是可能出現(xiàn)問題的地方。如果是被用于網(wǎng)絡(luò)請求,那么在閉包里面會被重復(fù)的請求。上面文中提到了信號被訂閱了6次,網(wǎng)絡(luò)請求也會請求6次。這并不是我們想要的。網(wǎng)絡(luò)請求只需要請求1次。如何做到信號只執(zhí)行一次閉包,最重要的一點是冷信號只能被訂閱一次。由于冷信號只能一對一,那么想一對多就只能交給熱信號去處理了。這時候就需要把冷信號轉(zhuǎn)換成熱信號。在v2.5中,冷信號轉(zhuǎn)換成熱信號需要用到這個類。:(,,)*;-(*);-(*);(){*;32;}(,,)*;()*;看看類的定義。最主要的是保存了兩個信號,一個是,一個是(類型)。在中暴露給外面的是,在中實際使用的是。看它的定義就能猜到接下去它會做什么:用去發(fā)送信號,內(nèi)部再用去訂閱,然后會把的信號值依次發(fā)給它的訂閱者們。用一個不恰當(dāng)?shù)谋扔鱽硇稳荩拖裆蠄D中心的那個“地球”,“地球”就是訂閱了的,把值發(fā)送給各個“連接”者(訂閱者)。只有內(nèi)部的一個訂閱者,所以就完成了我們只想執(zhí)行閉包一次,但是能把值發(fā)送給各個訂閱者的愿望。在看看的初始化-():(*):(*){();();=[];();=;=[[]];=;;}初始化方法就是把外界傳進(jìn)來的保存成,把外界傳進(jìn)來的保存成自己的屬性。有兩個連接方法。-(*){=32(0,1,);(){=[];};}這里出現(xiàn)了一個不多見的函數(shù)32,它是原子運(yùn)算的操作符,主要用于,原型如下:32(32,32,32*);關(guān)鍵字只確保每次獲取變量時都是從內(nèi)存加載變量,而不是使用寄存器里面的值,但是它不保證代碼訪問變量是正確的。如果用偽代碼去實現(xiàn)這個函數(shù):f(*){*=;1;}{0;}如果為0,意味著沒有連接,32返回1,就應(yīng)該連接。如果為1,意味著已經(jīng)連接過了,32返回0,不會再次連接。所謂連接的過程就是內(nèi)部用訂閱。是,會把訂閱者保存到中,的時候就會調(diào)用,這時就會把的信號都發(fā)送給各個訂閱者了。-(*){32=0;[[:^(<>){32();*=[];*=[];[:^{[];(32()0){[];}}];}]"[]",];}32和32也是原子運(yùn)算的操作符,分別是+1和-1操作。在為了保證線程安全,用到了一個的類似信號量的變量,保證第一個訂閱者能連接上。返回的新的信號的訂閱者訂閱,也會去訂閱內(nèi)部的。把冷信號轉(zhuǎn)換成熱信號用以下5種方式,5種方法都會用到。接下來一一分析它們的具體實現(xiàn)。1.:-(*):(*){["[]:",,];*=[[]];;}:的操作就是初始化一個對象,是,內(nèi)部的是入?yún)ⅰ?=[:[]];[:^(x){(@"");}];[];調(diào)用:把冷信號轉(zhuǎn)換成熱信號有一個點不方便的是,需要自己手動。注意轉(zhuǎn)換完之后的熱信號在的屬性中,所以需要訂閱的是。2.-(*){*=[[]"[]",];*=[];;}方法只不過是去調(diào)用了:方法,內(nèi)部會新建好一個,并把它當(dāng)成入?yún)鬟f給。*=[];[:^(x){(@"");}];[];同樣方法也需要手動的調(diào)用方法。3.-(*){*=[[]"[]",];*=[];[];;}方法會把當(dāng)成的傳遞進(jìn)去,初始化好了,再自動調(diào)用方法,返回的信號就是轉(zhuǎn)換好的熱信號,即里面的信號。這里必須是,因為在方法里面先了。如果用,那信號在之后就會通過把原信號發(fā)送給各個訂閱者了。用把信號保存起來,即使方法里面先,訂閱者后訂閱也是可以拿到之前的信號值的。4.-(*){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式設(shè)備調(diào)試方法試題及答案
- 網(wǎng)絡(luò)云計算技術(shù)測驗題及答案
- 數(shù)據(jù)庫開發(fā)中的協(xié)作工具與資源管理試題及答案
- 行政組織理論中的協(xié)同效應(yīng)分析試題及答案
- 公路工程考試面臨的知識更新挑戰(zhàn)試題及答案
- 突破2025年軟件測試工程師考試難度試題及答案
- 行政組織考試的系統(tǒng)化試題及答案
- 行政組織考試的備考指南試題及答案
- 專項公路工程復(fù)習(xí)試題及答案
- 整體把握的信息系統(tǒng)監(jiān)理師考試試題及答案
- 2025年5G網(wǎng)絡(luò)在無人機(jī)領(lǐng)域的應(yīng)用可行性研究報告
- 工業(yè)用地開發(fā)項目成本分析與資金籌措方案
- 2025-2030年中國正丁醇行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- (人教2024版)英語七年級下冊Unit7.4 Section B 1a-2d課件(新教材)
- 2025年廣東嘉城建設(shè)集團(tuán)有限公司及其下屬公司招聘筆試參考題庫含答案解析
- 新藥研究與開發(fā)技術(shù) 課件3.新藥的工藝與質(zhì)量研究
- 2025-2030中國基礎(chǔ)設(shè)施行業(yè)市場前景趨勢及競爭格局與投資研究報告
- 2025年統(tǒng)編版一年級(下)期末語文試題(含答案)
- 六防教育主題班會課件
- 武漢五調(diào)高三數(shù)學(xué)試卷及詳細(xì)答案
- 《社區(qū)公園》課件
評論
0/150
提交評論