1.ReactiveCocoa簡介
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架,Cocoa是蘋果整套框架的簡稱,因此很多蘋果框架喜歡以Cocoa結(jié)尾。
2.ReactiveCocoa作用
在我們iOS開發(fā)過程中,當(dāng)某些事件響應(yīng)的時候,需要處理某些業(yè)務(wù)邏輯,這些事件都用不同的方式來處理。
比如按鈕的點擊使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統(tǒng)提供的方式。
其實這些事件,都可以通過RAC處理
ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便,可以把要處理的事情,和監(jiān)聽的事情的代碼放在一起,這樣非常方便我們管理,就不需要跳到對應(yīng)的方法里。非常符合我們開發(fā)中高聚合,低耦合的思想。
3.編程思想
在開發(fā)中我們也不能太依賴于某個框架,否則這個框架不更新了,導(dǎo)致項目后期沒辦法維護,比如之前Facebook提供的Three20框架,在當(dāng)時也是神器,但是后來不更新了,也就沒什么人用了。因此我感覺學(xué)習(xí)一個框架,還是有必要了解它的編程思想。
4.ReactiveCocoa編程思想
ReactiveCocoa結(jié)合了幾種編程風(fēng)格:
函數(shù)式編程(Functional Programming)
響應(yīng)式編程(Reactive Programming)
所以,你可能聽說過ReactiveCocoa被描述為函數(shù)響應(yīng)式編程(FRP)框架。
以后使用RAC解決問題,就不需要考慮調(diào)用順序,直接考慮結(jié)果,把每一次操作都寫成一系列嵌套的方法中,使代碼高聚合,方便管理。
5.如何導(dǎo)入ReactiveCocoa框架
通常都會使用CocoaPods(用于管理第三方框架的插件)幫助我們導(dǎo)入。
PS:CocoaPods教程
use_frameworks!
pod'ReactiveCocoa','~> 4.0.4-alpha-4'
6.ReactiveCocoa常見類。
學(xué)習(xí)框架首要之處:個人認為先要搞清楚框架中常用的類,在RAC中最核心的類RACSiganl,搞定這個類就能用ReactiveCocoa開發(fā)了。
6.1.RACSiganl:信號類,一般表示將來有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變,信號內(nèi)部接收到數(shù)據(jù),就會馬上發(fā)出數(shù)據(jù)。
注意:
信號類(RACSiganl),只是表示當(dāng)數(shù)據(jù)改變時,信號內(nèi)部會發(fā)出數(shù)據(jù),它本身不具備發(fā)送信號的能力,而是交給內(nèi)部一個訂閱者去發(fā)出。
默認一個信號都是冷信號,也就是值改變了,也不會觸發(fā),只有訂閱了這個信號,這個信號才會變?yōu)闊嵝盘?,值改變了才會觸發(fā)。
如何訂閱信號:調(diào)用信號RACSignal的subscribeNext就能訂閱。
6.2.RACSubscriber:表示訂閱者的意思,用于發(fā)送信號,這是一個協(xié)議,不是一個類,只要遵守這個協(xié)議,并且實現(xiàn)方法才能成為訂閱者。通過create創(chuàng)建的信號,都有一個訂閱者,幫助他發(fā)送數(shù)據(jù)。
6.3.RACDisposable:用于取消訂閱或者清理資源,當(dāng)信號發(fā)送完成或者發(fā)送錯誤的時候,就會自動觸發(fā)它。
使用場景:不想監(jiān)聽某個信號時,可以通過它主動取消訂閱信號。
6.4.RACSubject:RACSubject:信號提供者,自己可以充當(dāng)信號,又能發(fā)送信號。
使用場景:通常用來代替代理,有了它,就不必要定義代理了。
6.5.RACReplaySubject:重復(fù)提供信號類,RACSubject的子類。
RACReplaySubject與RACSubject區(qū)別:
RACReplaySubject可以先發(fā)送信號,在訂閱信號,RACSubject就不可以。
使用場景一:如果一個信號每被訂閱一次,就需要把之前的值重復(fù)發(fā)送一遍,使用重復(fù)提供信號類。
使用場景二:可以設(shè)置capacity數(shù)量來限制緩存的value的數(shù)量,即只緩充最新的幾個值。
6.6.RACTuple:元組類,類似NSArray,用來包裝值.
6.7.RACSequence:RAC中的集合類,用于代替NSArray,NSDictionary,可以使用它來快速遍歷數(shù)組和字典。
6.8.RACCommand:RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞,包裝到這個類中,他可以很方便的監(jiān)控事件的執(zhí)行過程。
使用場景:監(jiān)聽按鈕點擊,網(wǎng)絡(luò)請求
6.9.RACMulticastConnection:用于當(dāng)一個信號,被多次訂閱時,為了保證創(chuàng)建信號時,避免多次調(diào)用創(chuàng)建信號中的block,造成副作用,可以使用這個類處理。
使用注意:RACMulticastConnection通過RACSignal的-publish或者-muticast:方法創(chuàng)建.
6.10.RACScheduler:RAC中的隊列,用GCD封裝的。
7.ReactiveCocoa開發(fā)中常見用法。
7.1. 代替代理:
rac_signalForSelector:用于替代代理。
7.2. 代替KVO :
rac_valuesAndChangesForKeyPath:用于監(jiān)聽某個對象的屬性改變。
7.3. 監(jiān)聽事件:
rac_signalForControlEvents:用于監(jiān)聽某個事件。
7.4.代替通知:
rac_addObserverForName:用于監(jiān)聽某個通知。
7.5. 監(jiān)聽文本框文字改變:
rac_textSignal:只要文本框發(fā)出改變就會發(fā)出這個信號。
7.6. 處理當(dāng)界面有多次請求時,需要都獲取到數(shù)據(jù)時,才能展示界面
rac_liftSelector:withSignalsFromArray:Signals:當(dāng)傳入的Signals(信號數(shù)組),每一個signal都至少sendNext過一次,就會去觸發(fā)第一個selector參數(shù)的方法。
使用注意:幾個信號,參數(shù)一的方法就幾個參數(shù),每個參數(shù)對應(yīng)信號發(fā)出的數(shù)據(jù)。