Subjects
所有行為都與此處描述的完全相同
Relays
RxRelay提供兩種Relays:PublishRelay和BehaviorRelay。它們的行為與并行Subjects相似,有兩處變化:
- Relays永遠(yuǎn)不會(huì)完成躏筏。
- Relays永遠(yuǎn)不會(huì)發(fā)出錯(cuò)誤侥钳。
本質(zhì)上,Relays只發(fā)出.next事件哲泊,永不終止剩蟀。
冷熱Observables
建議更多地將其視為序列的屬性而不是序列的類型,因?yàn)樗鼈兺耆蛇m合它們的相同抽象表示攻旦,Observable序列喻旷。
這是ReactiveX.io的定義
Observable何時(shí)開始序列元素?這取決于Observable牢屋∏以ぃ“熱”O(jiān)bservable可以在創(chuàng)建后立即開始發(fā)出元素,因此任何后來訂閱該Observable的觀察者都可以開始在中間某處觀察序列烙无。另一方面锋谐,“冷”O(jiān)bservable直到在觀察者訂閱它之前開始發(fā)射元素,因此這樣的觀察者保證從一開始就看到整個(gè)序列截酷。
熱Observables | 冷Observables |
---|---|
......是序列 | ......是序列 |
無論是否有任何觀察者訂閱涮拗,都要使用資源(“產(chǎn)生熱量”)。 | 在觀察者訂閱之前,不使用資源(不產(chǎn)生熱量)三热。 |
變量/屬性/常量鼓择,點(diǎn)擊坐標(biāo)系,鼠標(biāo)坐標(biāo)系就漾,UI控件值呐能,當(dāng)前時(shí)間 | 異步操作,HTTP連接抑堡,TCP連接摆出,流 |
通常包含~N個(gè)元素 | 通常包含~1個(gè)元素 |
無論是否有任何觀察者訂閱,都會(huì)產(chǎn)生序列元素首妖。 | 僅當(dāng)存在訂閱的觀察者時(shí)才生成序列元素偎漫。 |
序列計(jì)算資源通常在所有訂閱的觀察者之間共享。 | 通常為每個(gè)訂閱的觀察者分配序列計(jì)算資源有缆。 |
通常是有狀態(tài)的 | 通常無狀態(tài)的 |
Rx背后的數(shù)學(xué)
Observer和Iterator / Enumerator / Generator / Sequences之間的雙重性
觀察者模式和生成器模式之間存在雙重性象踊。這使能夠從異步回調(diào)的世界轉(zhuǎn)變到序列轉(zhuǎn)換的同步世界。
簡(jiǎn)而言之妒貌,枚舉器和觀察者模式都描述了序列通危。枚舉器定義序列的原因相當(dāng)簡(jiǎn)明,但觀察者稍微復(fù)雜一些灌曙。
然而菊碟,有一個(gè)非常簡(jiǎn)單的例子,不需要很多數(shù)學(xué)知識(shí)在刺。假設(shè)在給定時(shí)間觀察鼠標(biāo)光標(biāo)在屏幕上的位置逆害。隨著時(shí)間的推移,這些鼠標(biāo)位置形成序列蚣驼。實(shí)質(zhì)上魄幕,這是一個(gè)可觀察的序列。
可以通過兩種基本方式訪問序列的元素:
- Push interface - 觀察者(觀察到的元素隨著時(shí)間推移產(chǎn)生一個(gè)序列)
- Pull interface - 迭代器/枚舉器/生成器
還可以在此視頻中看到更正式的說明:
與其他框架比較
與ReactiveSwift比較
RxSwift有點(diǎn)類似于ReactiveSwift颖杏,因?yàn)镽eactiveSwift從Rx借用了大量概念纯陨。
該項(xiàng)目的主要目標(biāo)之一是創(chuàng)建一個(gè)更加簡(jiǎn)單的界面,使其與其他Rx實(shí)現(xiàn)更加一致留储,提供更豐富的并發(fā)模型翼抠,提供更多的優(yōu)化機(jī)制,并與內(nèi)置的Swift錯(cuò)誤處理機(jī)制更加一致获讳。
還決定僅依賴Swift / llvm編譯器阴颖,而不引入任何外部依賴項(xiàng)。
這些項(xiàng)目之間的主要區(qū)別可能在于其構(gòu)建抽象的方法丐膝。
RxSwift項(xiàng)目的主要目標(biāo)是提供以可觀察序列形式抽象的與環(huán)境無關(guān)的組合計(jì)算粘合劑量愧。
然后钾菊,我們旨在改善在特定平臺(tái)上使用RxSwift的體驗(yàn)。為此偎肃,RxCocoa使用通用計(jì)算來構(gòu)建更多實(shí)用的抽象并包裝Foundation / Cocoa / UKit框架煞烫。這意味著,其他庫(kù)使用上下文和通用計(jì)算引擎語義RxSwift提供了諸如Driver累颂,Signal红竭,ControlProperty,ControlEventS等等喘落。
將所有這些抽象表示為一個(gè)單獨(dú)的概念(observable sequences)的好處之一是,基于它們建立的所有計(jì)算的抽象也可以以相同的方式進(jìn)行組合最冰。它們都遵循相同的約定并實(shí)現(xiàn)相同的接口瘦棋。這也很容易建立靈活的subscription(資源)共享策略或使用一個(gè)內(nèi)置的:share,publish暖哨,multicast...
該庫(kù)還提供了fine-tunable并發(fā)模型赌朋。如果使用并發(fā)調(diào)度程序,則可觀察序列運(yùn)算符將保留序列屬性篇裁。相同的可觀察序列運(yùn)算符還知道如何發(fā)現(xiàn)和最佳地使用已知的串行調(diào)度程序沛慢。ReactiveSwift的并發(fā)模型更為有限,僅允許使用串行調(diào)度程序达布。
多線程編程確實(shí)非常困難团甲,而檢測(cè)不必要的等待循環(huán)則更加困難。這就是為什么所有操作符都以容錯(cuò)方式構(gòu)建的原因黍聂。即使在元素處理(遞歸)過程中發(fā)生元素生成躺苦,操作符也將嘗試處理這種情況并防止死鎖。這意味著在最壞的情況下产还,編程錯(cuò)誤將導(dǎo)致堆棧溢出匹厘,但用戶不必手動(dòng)終止該應(yīng)用程序,并且將在錯(cuò)誤報(bào)告系統(tǒng)中獲得崩潰報(bào)告脐区,以便查找并解決問題愈诚。