ReactiveCocoa 層次構成(筆記)

ReactiveCocoa 是一個iOS中的函數(shù)響應式編程框架,將原有的各種設計模式,如代理、Block回調(diào)、Target/Action、通知以及KVO等各種輸入,都抽象成信號(狀態(tài)流),
并且可以對不同的信號進行任意的組合和鏈式操作(比如映射,組合,過濾等),從最原始的輸入直到得到最終的輸出。

從層次上看,ReactiveCocoa主要四大核心組件構成:
1.信號源:RACStream及其子類(最核心部分)
2.訂閱者:RACSubscriber的實現(xiàn)類及其子類
3.調(diào)度起:RACScheduler及其子類
4.清潔工:RACDisposeable及其子類


信號源:

信號源代表的是隨著時間而改變的值流,訂閱者可以通過訂閱信號源來獲取這些值。
RACStream是ReactiveCocoa中最核心的類,代表的是任意的值流,它的主要繼承結構圖如下:
??RACStream是一個抽象類,一般并不會去實例化它,而是直接使用它的兩個子類RACSignal和RACSequence。
??RACSignal代表的是未來將會被傳送的值,它是一種push-driver(推驅動)的流。

它可以向訂閱者發(fā)送三種不同類型的事件:
next(向訂閱者傳送新的值,可為nil);
error(向訂閱者表明信號在正常結束前發(fā)生了錯誤);
completed(向訂閱者表明信號已經(jīng)正常結束)

通常情況下,一個信號的生命周期是由任意個next事件 和一個error事件或一個complete事件組成的。

RACSignal 為一個類簇,下面有5個子類
1.RACEmptySignal:空信號,用來實現(xiàn)RACSignal的+empty方法。
2.RACReturnSignal:一元信號,用來實現(xiàn)RACSignal的+return方法。
3.RACDynamicSignal:動態(tài)信號,使用一個block來實現(xiàn)訂閱行為,RACSignal 的+CreateSignal方法就是該類的實例
4.RACErrorSignal:錯誤信號,用來實現(xiàn)RACSignal的+error方法。
5.RACChannelTerminal:通道終端,代表RACChannel的一個終端,用來實現(xiàn)雙向綁定。
6.RACSubject:可以手動控制的信號,我們可以把它看作RACSignal的可變版本。

對于RACSignal類簇來說,最核心的方法為-subscribe:了,它是訂閱者與信號源產(chǎn)生聯(lián)系的唯一入口,它是一個抽象方法,由5個子類重寫實現(xiàn),是區(qū)分不同子類的關鍵。

RACSequence 代表的是一個不可變的值的序列,與RACSignal不同,它是pull-driven(拉驅動)類型的流,但它并不算信號源,因為不能被訂閱者訂閱,但是它與RACSignal之間可以非常方便的進行轉換。
??RACSequence有兩部分組成,head和tail(一個序列的tail仍然是一個序列),RACSequence可簡化Objective-C的集合操作。

RACSequence的一系列功能也是通過類簇來實現(xiàn)的,它共有9個不同功能的私有子類:
1.RACUnarySequence:一元序列,用來實現(xiàn)RACSequence的+return方法
2.RACIndexSetSequence:用來遍歷索引集;
3.RACEmptySequence:空序列, 用來實現(xiàn)RACSequence的+empty方法。
4.RACDynamicSequence:動態(tài)序列,使用blocks來動態(tài)地實現(xiàn)一個序列。
5.RACSignalSequence:用來遍歷信號中的值。
6.RACArraySequence:用來遍歷數(shù)組中的元素。
7.RACEagerSequence:非懶計算的序列,在初始化時立即計算所有的值。
8.RACStringSequence:用來遍歷字符串中的字符。
9.RACTupleSequence:用來遍歷元組中的元素。

訂閱者:

實現(xiàn)了RACSubscriber協(xié)議的類都可以作為信號源的訂閱者。
在RACSubscriber協(xié)議中,聲明了4個必須實現(xiàn)的方法。其中,-sendNext:、-sendError:和 -sendCompleted分別用來從RACSignal接受next、error和completed事件,而-didSubscriberWithDisposable:則接收代表某次訂閱的disposable對象。
??訂閱者對信號源的一次訂閱過程:通過RACSignal的-subscriber:方法傳入一個訂閱者,并最終返回一個RACDisposable對象。RACDisposable可以取消訂閱。

除了RACSignal的子類外,還有兩個實現(xiàn)了RACSubscriber協(xié)議的類
1.RACSubscriber
2.RACPassthroughSubscriber

調(diào)度器

調(diào)度訂閱者訂閱信號源過程中所涉及到的任務。
RACScheduler:扮演者調(diào)度器的角色,它是用GCD的串行隊列來實現(xiàn)的,并支持取消操作。在RAC中,并沒有使用到NSOperationQueue和NSRunloop技術。

RACScheduler 也是通過類簇實現(xiàn)
1.RACImmediateScheduler:立即執(zhí)行調(diào)度的任務
2.RACQueueScheduler:一個抽象的隊列調(diào)度器,在一個GCD串行隊列中已不調(diào)度所有任務
3.RACTargetQueueScheduler:繼承自RACQueueScheduler,在一個以任意的GCD隊列為target的串行隊列中異步調(diào)度所有任務。
4.RACSubscriptionScheduler:一個只用來調(diào)度訂閱的調(diào)度器

清潔工

在訂閱者訂閱信號源的過程中,可能會產(chǎn)生副作用和消耗一定的資源,所以在取消訂閱或完成訂閱時,需要做資源回收和垃圾清理。RACDisposable封裝了取消和清理一次訂閱所必須的工作,核心方法-dispose。

它有四個子類:
1.RACSerialDisposable:作為disposable的容易使用,可以包含一個disposable對象
2.RACKVOTrampoline:代表一次KVO觀察,并且可以用來停止觀察
3.RACCompoundDisposable:也作為disposable的容器使用,可以包含多個disposable對象,并且可以手動添加和移除對象,當其對象被disposed時,它所包含的所有disposable對象都會被disposed
4.RACScopeDisposable:當它被dealloc的時候調(diào)用本身的-dispose方法
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容