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
注意 如果直接輸入
會(huì)出現(xiàn)
我們需要輸入
- 其中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)載于雷純鋒博客)
接下來(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)代替纺阔。
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)源的訂閱者堕绩。
其中 -sendNext: 、-sendError: 和 -sendCompleted 分別用來(lái)從 RACSignal 接收 next 邑时、error 和 completed 事件而 -didSubscribeWithDisposable: 則用來(lái)接收代表某次訂閱的 disposable 對(duì)象
它的兩個(gè)子類:
-------------------------------------以上是訂閱者-------------------------------------------
6 RACScheduler (調(diào)度器)
RACScheduler 在 ReactiveCocoa 中就是扮演著調(diào)度器的角色奴紧,本質(zhì)上,它就是用 GCD 的串行隊(duì)列來(lái)實(shí)現(xiàn)的刁愿,并且支持取消操作绰寞。RACScheduler 也只是對(duì) GCD 的簡(jiǎn)單封裝而已。
其中主要的子類為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)
-------------------------------------以上是清潔工的說(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)注罗心。