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方法