ReactiveCocoa 基礎(chǔ).框架介紹

ReactiveCocoa 是一個(gè)很強(qiáng)大的第三方庫(kù)脐瑰,我記得有人評(píng)論ReactiveCocoa強(qiáng)大的地步 它可以完成你想要的任何一個(gè)操作飒货,除非你想象不到魄衅。 在此之前也用過一點(diǎn)ReactiveCocoa 但也僅限于和AFN來(lái)結(jié)合封裝網(wǎng)絡(luò)庫(kù),使用一點(diǎn)ReactiveCocoa中一點(diǎn)UI的API 膏斤,趁著空閑幾天時(shí)間來(lái)查了查ReactiveCocoa 的使用和里面的一點(diǎn)源碼徐绑。 其中在 雷純鋒的博客 從中獲得了一些體會(huì)邪驮。

ReactiveCocoa 簡(jiǎn)介

ReactiveCocoa(簡(jiǎn)稱為RAC)莫辨,是由Github開源的一個(gè)應(yīng)用于iOS和OS開發(fā)的新框架RAC具有函數(shù)響應(yīng)式(FRP) 編程特性(函數(shù)式編程:使用高階函數(shù),例如函數(shù)用其他函數(shù)作為參數(shù), 響應(yīng)式編程:關(guān)注于數(shù)據(jù)流和變化傳播)

ReactiveCocoa 的作用

官方回答是

事件流統(tǒng)一了Cocoa用于事件和異步處理的常用模式包括:
委托方法
回調(diào)blocks
通知
控件的actions和響應(yīng)事件鏈
Futures and promises
Key-value observing (KVO)

自己認(rèn)為它的作用可以幫助我們做

  • 解決一些狀態(tài)或者狀態(tài)依賴過多的問題
  • 就是類似于官方說(shuō)的 它提供了一個(gè)統(tǒng)一提供統(tǒng)一的消息傳遞分發(fā)機(jī)制更能清晰的表達(dá)出消息傳遞中各種邏輯關(guān)系毅访。
  • 可以和MVVM結(jié)合 承擔(dān)View和ViewMode的bind角色 解決Controller的冗余度
ReactiveCocoa 集成

一般會(huì)使用CocoPods來(lái)集成, 對(duì)于CocoPods不太清楚的可以點(diǎn)擊鏈接沮榜,里面有完整的教程。

用終端進(jìn)入項(xiàng)目的路徑下 輸入 Vim Podfile
注意 如果直接輸入

屏幕快照 2017-08-31 上午11.29.41.png

會(huì)出現(xiàn)


屏幕快照 2017-08-31 上午11.30.03.png

我們需要輸入


屏幕快照 2017-08-31 上午11.32.14.png
  • 其中platform 表名你支持的最低ios版本
  • target 后面緊跟你的項(xiàng)目名稱
  • ReactiveObjC表名的是OC版本 如果想用swift版本直接ReactiveCocoa即可

如果不習(xí)慣用CocoPods的話 可以去ReactiveCocoa Github下載配置

ReactiveCocoa 框架

在講框架之前 我們會(huì)先解釋兩個(gè)名詞:

  • signal : 信號(hào)管 這是ReactvieCocoa的核心 借用別人博客中的比喻 我們可以把信號(hào)想象成一個(gè)水龍頭
  • subscriber: 訂閱者 我們可以把訂閱者想象成水龍頭出水口

可以把信號(hào)管(Signal)想象成水龍頭喻粹,只不過里面不是水蟆融,而是玻璃球(Value),直徑跟水管的內(nèi)徑一樣守呜,這樣就能保證玻璃球是依次排列型酥,不會(huì)出現(xiàn)并排的情況,水龍頭的開關(guān)是默認(rèn)關(guān)閉的查乒,除非有(subscriber),才會(huì)開打開弥喉。這樣只要有新的玻璃球(value)過來(lái)就會(huì)傳送給訂閱者

ReactiveCocoa整體的框架圖(圖片轉(zhuǎn)載于雷純鋒博客)
ReactiveCocoa v2.5.png

接下來(lái)我們會(huì)逐步的分解這個(gè)框架圖

1 RACStream類 (信號(hào))

水管里面流動(dòng)的一系列玻璃球,它們有順序的依次通過玛迄,在第一個(gè)玻璃球沒有到達(dá)之前由境,你沒法獲得第二個(gè)玻璃球,RACStream描述的就是這種線性流動(dòng)玻璃球的形態(tài)蓖议,比較抽象虏杰,是作為描述抽象的父類,它本身的使用意義并不很大勒虾,一般會(huì)以RACSignal或者RACSequence等這些更高層次的表現(xiàn)形態(tài)代替纺阔。

屏幕快照 2017-08-31 下午1.53.26.png
2 RACSignal類

在RAC中最核心的類就是RACSiganl,一般表示將來(lái)有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變修然,信號(hào)內(nèi)部接收到數(shù)據(jù)州弟,就會(huì)馬上發(fā)出數(shù)據(jù)钧栖。 它只是在內(nèi)部發(fā)出數(shù)據(jù),但是它不具有發(fā)送信號(hào)的能力婆翔,必須交給內(nèi)部的訂閱者(Subscriber)才能發(fā)送拯杠。稍后我們會(huì)講解訂閱者

RACSignal 可以向訂閱者發(fā)送三種不同類型的事件:

  • next :RACSignal 通過 next 事件向訂閱者傳送新的值,并且這個(gè)值可以為 nil 啃奴;
  • error :RACSignal 通過 error 事件向訂閱者表明信號(hào)在正常結(jié)束前發(fā)生了錯(cuò)誤潭陪;
  • completed :RACSignal 通過 completed 事件向訂閱者表明信號(hào)已經(jīng)正常結(jié)束,不會(huì)再有后續(xù)的值傳送給訂閱者最蕾。

通常情況下依溯,一個(gè)信號(hào)的生命周期是由任意個(gè) next 事件和一個(gè) error 事件或一個(gè) completed 事件組成的。

3 RACSequence類

RACSequence類瘟则,可以簡(jiǎn)單看做是RAC世界的集合類黎炉,RAC增加了-rac_sequence方法,可以使諸如NSArray這些集合類直接轉(zhuǎn)換為RACSequence來(lái)使用醋拧。它存在的意義就是簡(jiǎn)化OC中的集合操作慷嗜,它并不是一個(gè)信號(hào),因?yàn)樗荒鼙挥嗛啞?/p>

4 RACSubject類

如果RACsingal 是NSArray 那么RACSubject 就是NSMutableNSArray 它可以手動(dòng)控制的信號(hào)丹壕。因?yàn)樗^承與RACSingal 所以它可以當(dāng)做信號(hào)源被訂閱庆械,同時(shí)它又實(shí)現(xiàn)了RACSubscriber 協(xié)議,所以它也可以作為訂閱者去訂閱其他的信號(hào)菌赖,它的使用場(chǎng)景 通常用于代替代理或者使用MVVM統(tǒng)一管理ViewModel的某個(gè)邏輯

-----------------------------------------以上是信號(hào)源--------------------------------------------

5 RACSubscriber類 (訂閱者)

前面說(shuō)到 RACSignal不具有發(fā)送信號(hào)的能力缭乘,必須交給內(nèi)部的訂閱者(Subscriber)才能發(fā)送. 那么訂閱者是什么的? 在RAC中訂閱者是一個(gè)很抽象的概念琉用,我們可以理解只要實(shí)現(xiàn)了RACSubscriber 協(xié)議的類都可以作為信號(hào)源的訂閱者堕绩。

屏幕快照 2017-08-31 下午2.21.46.png

其中 -sendNext: 、-sendError: 和 -sendCompleted 分別用來(lái)從 RACSignal 接收 next 邑时、error 和 completed 事件而 -didSubscribeWithDisposable: 則用來(lái)接收代表某次訂閱的 disposable 對(duì)象

它的兩個(gè)子類:

屏幕快照 2017-08-31 下午2.32.59.png

-------------------------------------以上是訂閱者-------------------------------------------

6 RACScheduler (調(diào)度器)

RACScheduler 在 ReactiveCocoa 中就是扮演著調(diào)度器的角色奴紧,本質(zhì)上,它就是用 GCD 的串行隊(duì)列來(lái)實(shí)現(xiàn)的刁愿,并且支持取消操作绰寞。RACScheduler 也只是對(duì) GCD 的簡(jiǎn)單封裝而已。

屏幕快照 2017-08-31 下午2.35.06.png

其中主要的子類為RACTargetQueueScheduler

-------------------------------------以上是調(diào)度器的說(shuō)明------------------------------------------------

7 RACDisposable (清潔工)

訂閱者訂閱信號(hào)源的過程中铣口,可能會(huì)產(chǎn)生副作用或者消耗一定的資源滤钱,所以當(dāng)我們?cè)谌∠嗛喕蛘咄瓿捎嗛啎r(shí),我們就需要做一些資源回收和垃圾清理的工作脑题。

RACDisposable 在 ReactiveCocoa 中就充當(dāng)著清潔工的角色件缸,它封裝了取消和清理一次訂閱所必需的工作。它有一個(gè)核心的方法 -dispose 叔遂,調(diào)用這個(gè)方法就會(huì)執(zhí)行相應(yīng)的清理工作他炊,這有點(diǎn)類似于 NSObject 的 -dealloc 方法 它主要用于取消訂閱或者清理資源争剿,當(dāng)信號(hào)發(fā)送完成或者發(fā)送錯(cuò)誤的時(shí)候,就會(huì)自動(dòng)觸發(fā)它痊末。每次信號(hào)都會(huì)返回一個(gè)Disposable類型的實(shí)例蚕苇,當(dāng)我們不想監(jiān)聽某個(gè)信號(hào) 可以手動(dòng)調(diào)用它的 dispose 來(lái)取消訂閱信號(hào)


屏幕快照 2017-08-31 下午2.35.20.png

-------------------------------------以上是清潔工的說(shuō)明------------------------------------------------

總結(jié)

這篇文章主要介紹了以上幾個(gè)核心組件的作用,對(duì)ReactiveCocoa的架構(gòu)有一個(gè)宏觀的認(rèn)識(shí)凿叠。它的主要流程就是有一個(gè)信號(hào)源被訂閱者訂閱了涩笤,在調(diào)度器的調(diào)配下去發(fā)送信號(hào),然后發(fā)送完信號(hào)后在合適的時(shí)機(jī)去由清潔工去清理盒件,釋放內(nèi)存蹬碧。(其中信號(hào)源,訂閱者炒刁,調(diào)度器恩沽,清潔工這幾個(gè)名詞借用的雷純鋒博客中的)。

接下來(lái)會(huì)以代碼例子以及講解內(nèi)部源碼的形式去如何使用reactvieCocoa 翔始,如果喜歡請(qǐng)關(guān)注罗心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绽昏,隨后出現(xiàn)的幾起案子协屡,更是在濱河造成了極大的恐慌俏脊,老刑警劉巖全谤,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爷贫,居然都是意外死亡认然,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門漫萄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卷员,“玉大人,你說(shuō)我怎么就攤上這事腾务”下猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵岩瘦,是天一觀的道長(zhǎng)未巫。 經(jīng)常有香客問我,道長(zhǎng)启昧,這世上最難降的妖魔是什么叙凡? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮密末,結(jié)果婚禮上握爷,老公的妹妹穿的比我還像新娘跛璧。我一直安慰自己,他們只是感情好新啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布追城。 她就那樣靜靜地躺著,像睡著了一般燥撞。 火紅的嫁衣襯著肌膚如雪漓柑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天叨吮,我揣著相機(jī)與錄音辆布,去河邊找鬼。 笑死茶鉴,一個(gè)胖子當(dāng)著我的面吹牛锋玲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涵叮,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼惭蹂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了割粮?” 一聲冷哼從身側(cè)響起盾碗,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舀瓢,沒想到半個(gè)月后廷雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡京髓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年航缀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堰怨。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芥玉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出备图,到底是詐尸還是另有隱情灿巧,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布揽涮,位于F島的核電站抠藕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绞吁。R本人自食惡果不足惜幢痘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家破。 院中可真熱鬧颜说,春花似錦购岗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至玄妈,卻和暖如春乾吻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拟蜻。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工绎签, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝锅。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓诡必,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搔扁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爸舒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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