ReactiveCocoa 是一個(gè)iOS中的函數(shù)響應(yīng)式編程框架,將原有的各種設(shè)計(jì)模式添履,如代理屁倔、Block回調(diào)、Target/Action暮胧、通知以及KVO等各種輸入锐借,都抽象成信號(hào)(狀態(tài)流)问麸,
并且可以對(duì)不同的信號(hào)進(jìn)行任意的組合和鏈?zhǔn)讲僮鳎ū热缬成洌M合瞎饲,過濾等)口叙,從最原始的輸入直到得到最終的輸出炼绘。
從層次上看嗅战,ReactiveCocoa主要四大核心組件構(gòu)成:
1.信號(hào)源:RACStream及其子類(最核心部分)
2.訂閱者:RACSubscriber的實(shí)現(xiàn)類及其子類
3.調(diào)度起:RACScheduler及其子類
4.清潔工:RACDisposeable及其子類
信號(hào)源:
信號(hào)源代表的是隨著時(shí)間而改變的值流,訂閱者可以通過訂閱信號(hào)源來獲取這些值俺亮。
RACStream是ReactiveCocoa中最核心的類驮捍,代表的是任意的值流,它的主要繼承結(jié)構(gòu)圖如下:
??RACStream是一個(gè)抽象類脚曾,一般并不會(huì)去實(shí)例化它东且,而是直接使用它的兩個(gè)子類RACSignal和RACSequence。
??RACSignal代表的是未來將會(huì)被傳送的值本讥,它是一種push-driver(推驅(qū)動(dòng))的流珊泳。
它可以向訂閱者發(fā)送三種不同類型的事件:
next(向訂閱者傳送新的值,可為nil);
error(向訂閱者表明信號(hào)在正常結(jié)束前發(fā)生了錯(cuò)誤)拷沸;
completed(向訂閱者表明信號(hào)已經(jīng)正常結(jié)束)
通常情況下色查,一個(gè)信號(hào)的生命周期是由任意個(gè)next事件 和一個(gè)error事件或一個(gè)complete事件組成的。
RACSignal 為一個(gè)類簇撞芍,下面有5個(gè)子類
1.RACEmptySignal:空信號(hào)秧了,用來實(shí)現(xiàn)RACSignal的+empty方法。
2.RACReturnSignal:一元信號(hào)序无,用來實(shí)現(xiàn)RACSignal的+return方法验毡。
3.RACDynamicSignal:動(dòng)態(tài)信號(hào),使用一個(gè)block來實(shí)現(xiàn)訂閱行為帝嗡,RACSignal 的+CreateSignal方法就是該類的實(shí)例
4.RACErrorSignal:錯(cuò)誤信號(hào)晶通,用來實(shí)現(xiàn)RACSignal的+error方法。
5.RACChannelTerminal:通道終端哟玷,代表RACChannel的一個(gè)終端狮辽,用來實(shí)現(xiàn)雙向綁定。
6.RACSubject:可以手動(dòng)控制的信號(hào)碗降,我們可以把它看作RACSignal的可變版本隘竭。
對(duì)于RACSignal類簇來說,最核心的方法為-subscribe:了讼渊,它是訂閱者與信號(hào)源產(chǎn)生聯(lián)系的唯一入口动看,它是一個(gè)抽象方法,由5個(gè)子類重寫實(shí)現(xiàn)爪幻,是區(qū)分不同子類的關(guān)鍵菱皆。
RACSequence 代表的是一個(gè)不可變的值的序列须误,與RACSignal不同,它是pull-driven(拉驅(qū)動(dòng))類型的流仇轻,但它并不算信號(hào)源京痢,因?yàn)椴荒鼙挥嗛喺哂嗛啠撬cRACSignal之間可以非常方便的進(jìn)行轉(zhuǎn)換篷店。
??RACSequence有兩部分組成祭椰,head和tail(一個(gè)序列的tail仍然是一個(gè)序列),RACSequence可簡(jiǎn)化Objective-C的集合操作疲陕。
RACSequence的一系列功能也是通過類簇來實(shí)現(xiàn)的方淤,它共有9個(gè)不同功能的私有子類:
1.RACUnarySequence:一元序列,用來實(shí)現(xiàn)RACSequence的+return方法
2.RACIndexSetSequence:用來遍歷索引集蹄殃;
3.RACEmptySequence:空序列携茂, 用來實(shí)現(xiàn)RACSequence的+empty方法。
4.RACDynamicSequence:動(dòng)態(tài)序列诅岩,使用blocks來動(dòng)態(tài)地實(shí)現(xiàn)一個(gè)序列讳苦。
5.RACSignalSequence:用來遍歷信號(hào)中的值。
6.RACArraySequence:用來遍歷數(shù)組中的元素吩谦。
7.RACEagerSequence:非懶計(jì)算的序列鸳谜,在初始化時(shí)立即計(jì)算所有的值。
8.RACStringSequence:用來遍歷字符串中的字符逮京。
9.RACTupleSequence:用來遍歷元組中的元素卿堂。
訂閱者:
實(shí)現(xiàn)了RACSubscriber協(xié)議的類都可以作為信號(hào)源的訂閱者。
在RACSubscriber協(xié)議中懒棉,聲明了4個(gè)必須實(shí)現(xiàn)的方法草描。其中,-sendNext:策严、-sendError:和 -sendCompleted分別用來從RACSignal接受next穗慕、error和completed事件,而-didSubscriberWithDisposable:則接收代表某次訂閱的disposable對(duì)象。
??訂閱者對(duì)信號(hào)源的一次訂閱過程:通過RACSignal的-subscriber:方法傳入一個(gè)訂閱者妻导,并最終返回一個(gè)RACDisposable對(duì)象逛绵。RACDisposable可以取消訂閱。
除了RACSignal的子類外倔韭,還有兩個(gè)實(shí)現(xiàn)了RACSubscriber協(xié)議的類
1.RACSubscriber
2.RACPassthroughSubscriber
調(diào)度器
調(diào)度訂閱者訂閱信號(hào)源過程中所涉及到的任務(wù)术浪。
RACScheduler:扮演者調(diào)度器的角色,它是用GCD的串行隊(duì)列來實(shí)現(xiàn)的寿酌,并支持取消操作胰苏。在RAC中,并沒有使用到NSOperationQueue和NSRunloop技術(shù)醇疼。
RACScheduler 也是通過類簇實(shí)現(xiàn)
1.RACImmediateScheduler:立即執(zhí)行調(diào)度的任務(wù)
2.RACQueueScheduler:一個(gè)抽象的隊(duì)列調(diào)度器硕并,在一個(gè)GCD串行隊(duì)列中已不調(diào)度所有任務(wù)
3.RACTargetQueueScheduler:繼承自RACQueueScheduler法焰,在一個(gè)以任意的GCD隊(duì)列為target的串行隊(duì)列中異步調(diào)度所有任務(wù)。
4.RACSubscriptionScheduler:一個(gè)只用來調(diào)度訂閱的調(diào)度器
清潔工
在訂閱者訂閱信號(hào)源的過程中倔毙,可能會(huì)產(chǎn)生副作用和消耗一定的資源埃仪,所以在取消訂閱或完成訂閱時(shí),需要做資源回收和垃圾清理陕赃。RACDisposable封裝了取消和清理一次訂閱所必須的工作卵蛉,核心方法-dispose。
它有四個(gè)子類:
1.RACSerialDisposable:作為disposable的容易使用凯正,可以包含一個(gè)disposable對(duì)象
2.RACKVOTrampoline:代表一次KVO觀察毙玻,并且可以用來停止觀察
3.RACCompoundDisposable:也作為disposable的容器使用,可以包含多個(gè)disposable對(duì)象廊散,并且可以手動(dòng)添加和移除對(duì)象,當(dāng)其對(duì)象被disposed時(shí)梧疲,它所包含的所有disposable對(duì)象都會(huì)被disposed
4.RACScopeDisposable:當(dāng)它被dealloc的時(shí)候調(diào)用本身的-dispose方法