ReactiveCocoa 層次構(gòu)成(筆記)

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方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允睹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幌氮,更是在濱河造成了極大的恐慌缭受,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该互,死亡現(xiàn)場(chǎng)離奇詭異米者,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宇智,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蔓搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人随橘,你說我怎么就攤上這事喂分。” “怎么了机蔗?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蒲祈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我萝嘁,道長(zhǎng)梆掸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任牙言,我火速辦了婚禮酸钦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嬉挡。我一直安慰自己钝鸽,他們只是感情好汇恤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔恰,像睡著了一般因谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颜懊,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天财岔,我揣著相機(jī)與錄音,去河邊找鬼河爹。 笑死匠璧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咸这。 我是一名探鬼主播夷恍,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼媳维!你這毒婦竟也來了酿雪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤侄刽,失蹤者是張志新(化名)和其女友劉穎指黎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體州丹,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋安,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墓毒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓揪。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚁鳖,靈堂內(nèi)的尸體忽然破棺而出磺芭,到底是詐尸還是另有隱情,我是刑警寧澤醉箕,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布钾腺,位于F島的核電站,受9級(jí)特大地震影響讥裤,放射性物質(zhì)發(fā)生泄漏放棒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一己英、第九天 我趴在偏房一處隱蔽的房頂上張望间螟。 院中可真熱鬧,春花似錦、人聲如沸厢破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩泪。三九已至笆焰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間见坑,已是汗流浹背嚷掠。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荞驴,地道東北人不皆。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熊楼,于是被迫代替她去往敵國和親霹娄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容