概述:
ReactiveCocoa(簡稱為RAC
),是由Github開源的一個應用於iOS和OS開發的一個框架,有時間,自己也了解學習了一下這個框架的一些基本的應用,其實你要學的話網上是有很多很多的博客給你去仔細的學習這個框架,我也把自己看到的覺得很不錯的博客整理出來,方便大家以后學習也方便自己鞏固這些知識!
ReactiveCocoa是做什么的?
引述自己學習的《最快讓你上手ReactiveCocoa之基礎篇》這篇博客里面的概述,說說 ReactiveCocoa 的作用;
- 在我們iOS開發過程中,當某些事件響應的時候,需要處理某些業務邏輯,這些事件都用不同的方式來處理。
- 比如按鈕的點擊使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統提供的方式。
- 其實這些事件,都可以通過RAC處理
- ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便,可以把要處理的事情,和監聽的事情的代碼放在一起,這樣非常方便我們管理,就不需要跳到對應的方法里。非常符合我們開發中
高聚合,低耦合
的思想。
這是博客里面作者的概述,其實作者已經說的很明白了,簡單點的一句話總結,ReactiveCocoa 其實就是一個用來幫我們處理事件的一個三方的框架!
學習的博客里面是通過總結我們常見編程思想來入手給我們講解ReactiveCocoa這個框架的,把所知的編程思想羅列出來,你要覺得你還是沒有理解這些編程思想或者有所疑惑的話,你都可以去上網搜搜或者翻翻我學習的文章去看看。
一 面相對象:處理事情以過程為核心,一步一步的實現。
解釋:用以前常說的怎么把大象放在冰箱里面為例,你要從面向過程去考慮的話你就得一步一步的把這個整個過程拆分開去做。
第一步:把大象剁了(當然,只是這樣說說而已,別真的這樣做,我們還是要保護大象!只為解釋一下這個面相過程的思想O(∩_∩)0)。
第二步:把冰箱門打開。
第三步:一塊塊的把大象放進去。
第四步:把冰箱門關上,這就是面相過程你所需要考慮的。
二 面相對象:萬物皆對象
同樣以上面的過程為例,你需要考慮的只是把冰箱打開,把大象放進去就行了,至於怎么放這些步驟你就不需要考慮了,我們只關心對象,不關心過程。
三 鏈式編程思想:關注於數據流和變化傳播,是將多個操作通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好。像這樣調用a(1).b(2).c(3)
代表:masonry框架。
四 響應式編程思想:不需要考慮調用順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然后影響結果,借用面向對象的一句話,萬物皆是流。
代表:KVO運用。
五 函數式編程思想
:例如函數用其他函數作為參數。
代表:ReactiveCocoa。
上面這么多,就把它的作用和它所用的編程思想做了一個類比和分析。看看它的基本的使用:
先說說安裝:
這個的話我自己是強烈建議使用Cocoapods的,還不知道怎么安裝的看以前的博客《CocoaPods 2016最新安裝和使用說明》,把安裝的終端代碼給大家參考:
target 'RaectiveCocoaTest' do use_frameworks! pod 'ReactiveCocoa', '~>4.0.2-alpha-1' end
ReactiveCocoa 的使用:
三方開頭頭文件先行:#import "ReactiveCocoa"
一 RACSiganl (信號類):你可以把下面代碼放在你的控制器當中運行一遍,我們看着代碼解釋這個類;
RACSignal * singel = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // subscriber 是訂閱者,這是一個協議,不是一個類。發送信號 1 [subscriber sendNext:@2]; // 發送完成 [subscriber sendCompleted]; // RACDisposable:用於取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。 // 執行完Block后,當前信號就不在被訂閱了。 return [RACDisposable disposableWithBlock:^{ NSLog(@"信號被銷毀"); }]; }]; //singel信號類調用subscribeNext方法訂閱信號。訂閱之后才會激活這個信號,注意順序! [singel subscribeNext:^(id x) { // block調用時刻:每當有信號發出數據,就會調用block. NSLog(@"接收到數據:%@",x); }];
XCode打印出:
2016-08-09 15:12:53.437 RaectiveCocoaTest[21421:170391] 接收到數據:2
2016-08-09 15:12:53.438 RaectiveCocoaTest[21421:170391] 信號被銷毀
解釋:
1:RACSiganl(信號類)只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交給內部一個訂閱者subscriber去發出。
2:默認一個信號都是冷信號,就算是值改變了,但你沒有訂閱這個信號的話它也不會觸發的,只有訂閱了這個信號,這個信號才會變為熱信號,值改變了才會觸發。
二:RACSubject(信號提供者)它自己可以充當信號,又能發送信號。
RACReplaySubject (信號重復提供者)它是RACSubject的子類。
RACSubject * subject = [RACSubject subject]; // 自己訂閱了信號 [subject subscribeNext:^(id x) { NSLog(@"第一個訂閱者%@",x); }]; [subject subscribeNext:^(id x) { NSLog(@"第二個訂閱者%@",x ); }]; // 自己發送了信號 [subject sendNext:@"520"];
XCode打印:
2016-08-09 15:41:44.464 RaectiveCocoaTest[23130:189079] 第一個訂閱者520
2016-08-09 15:41:44.464 RaectiveCocoaTest[23130:189079] 第二個訂閱者520
// 1.創建信號 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.發送信號 [replaySubject sendNext:@11]; [replaySubject sendNext:@22]; // 3.訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第一個訂閱者接收到的數據%@",x); }]; // 訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第二個訂閱者接收到的數據%@",x); }];
XCode打印:
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第一個訂閱者接收到的數據1
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第一個訂閱者接收到的數據2
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第二個訂閱者接收到的數據1
2016-08-09 15:45:03.729 RaectiveCocoaTest[23370:191718] 第二個訂閱者接收到的數據2
解釋:這里大家可以仔細看看,你不管第一次還是第二次訂閱之后,它是把你以前發送的消息全都接受了一遍!而且它們倆的區別也要注意:
RACReplaySubject可以先發送信號,在訂閱信號,RACSubject就不可以。
擴展:在上面學習的博客當中, RACSubject這個類是可以用來代替代理的,這里篇幅怕太長,影響大家閱讀的內心,就不粘貼代碼了,你可以去《最快讓你上手ReactiveCocoa之基礎篇》學習寫一下,其實我建議大家已經掌握了他最基本的使用之后,可以自己嘗試寫一下,難度也不大。
三:RACSequence RAC中的集合類,可用來快速遍歷數組,字典!
RACTuple RAC中的元組類,類似NSArray,用來包裝值。看下面簡單的使用。
先說說這個 RACSequence的簡單使用;
//遍歷數組 NSArray *numbers = @[@1,@2,@3,@4]; // 這里其實是三步 // 第一步: 把數組轉換成集合RACSequence numbers.rac_sequence // 第二步: 把集合RACSequence轉換RACSignal信號類,numbers.rac_sequence.signal // 第三步: 訂閱信號,激活信號,會自動把集合中的所有值,遍歷出來。 [numbers.rac_sequence.signal subscribeNext:^(id x) { NSLog(@"%@",x); }];
XCode打印
2016-08-09 16:24:55.445 RaectiveCocoaTest[25803:220322] 1
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 2
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 3
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 4
// 遍歷字典,遍歷出來的鍵值對會包裝成RACTuple(元組對象 NSDictionary *dict = @{@"name":@"張旭",@"age":@24}; [dict.rac_sequence.signal subscribeNext:^(RACTuple *x) { // RACTuple 就是一個元組,元組的概念在Swift有專門的介紹,沒掌握的可以自己上網查一下! NSLog(@"RACTuple = %@",x); // 解包元組,會把元組的值,按順序給參數里面的變量賦值 RACTupleUnpack(NSString *key,NSString *value) = x; // 相當於以下寫法 // NSString *key = x[0]; // NSString *value = x[1]; NSLog(@"%@ %@",key,value); }];
XCode打印:
2016-08-09 16:12:21.204 RaectiveCocoaTest[25041:211762] RACTuple = <RACTuple: 0x7f9703d17860> (
name,
"\U5f20\U65ed"
)
2016-08-09 16:12:21.205 RaectiveCocoaTest[25041:211762] name 張旭
2016-08-09 16:12:21.206 RaectiveCocoaTest[25041:211762] RACTuple = <RACTuple: 0x7f9703e0ae60> (
age,
24
)
2016-08-09 16:12:21.206 RaectiveCocoaTest[25041:211762] age 24
解釋:上面的注釋里面解釋就寫得和很清楚了,就不在下面單獨作解釋了。
四:RACCommand
RAC中用於處理事件的類,可以把事件如何處理,事件中的數據如何傳遞,包裝到這個類中,他可以很方便的監控事件的執行過程。
使用場景:監聽按鈕點擊,網絡請求
五 RACMulticastConnection
用於當一個信號,被多次訂閱時,為了保證創建信號時,避免多次調用創建信號中的block,造成副作用,可以使用這個類 處理。
這兩部分的內容自己還沒好好研究,后面會補充。需要可以先去前面看看。
ReactiveCocoa常見的方法:
1 代替代理: rac_signalForSelector
:用於替代代理。
2 代替KVO : rac_valuesAndChangesForKeyPath
:用於監聽某個對象的屬性改變。
3 監聽事件: rac_signalForControlEvents
:用於監聽某個事件。
4 代替通知: rac_addObserverForName
:用於監聽某個通知。
5 監聽文本框文字改變: rac_textSignal
:只要文本框發出改變就會發出這個信號。
6 處理當界面有多次請求時,需要都獲取到數據時,才能展示界面;rac_liftSelector:withSignalsFromArray:Signals
:當傳入的Signals(信號數組),每一個signal都至少sendNext過一次,就會去觸發第一個selector參數的方法。
使用注意:幾個信號,參數一的方法就幾個參數,每個參數對應信號發出的數據。
上面這部分是由代碼示例的,我學習的博客作者是寫了的,大家可以去看看學習一下。
學習鏈接給大家: