iOS-ReactiveCocoa(RAC)的初步瞭解以及基本使用
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架
Github-ReactiveCocoa地址
一直聽說RAC,但一直未使用過,最近不算忙,研究和學習了一下,非常感謝
崢吖大神對RAC 的細解,受益匪淺。
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架。
擷取Github上對ReactiveCocoa的說明:
RAC是提供事件流,通過訊號源和訊號源提供者(產生者),訊號接受者協和來完成。
借用面向物件的一句話,萬物皆是流的形式,通過一方發出訊號,一方接受訊號來完成不同事件。
ReactiveCocoa作用
- 代理方法
- block 回撥
- 通知
- 行為控制和事件的響應鏈
- 協議
- KVO
- ……
主要作用:
高內聚,低耦合,使程式碼更加內聚,也便於程式碼的讀取
響應式程式設計思想:
不需要考慮呼叫順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用面向物件的一句話,萬物皆是流。
函數語言程式設計思想:
是把操作儘量寫成一系列巢狀的函式或者方法呼叫。
特點:每個方法必須有返回值(本身物件),把函式或者Block當做引數,block參
數(需要操作的值)block返回值(操作結果)。
ReactiveCocoa程式設計風格:
ReactiveCocoa結合了 函數語言程式設計(Functional Programming)和 響應式程式設計(Reactive Programming)各自的優點,產生一種新的語法
如何匯入ReactiveCocoa框架
1.CocoaPods
pod 'ReactiveCocoa'
有的需要在podfile中加入use_frameworks!,到時候終端會提醒的
我匯入時需要加入target,如圖所示
2.手動匯入
由於工程之前一直是手動匯入第三方框架,所以也希望手動新增ReactiveCocoa這個框架,但ReactiveCocoa在GitHub上並沒有說明如何新增,需要哪些依賴等,所以自己直接把ReactiveCocoa整個資料夾拖到工程中,build以後,哪裡報錯修改哪裡,最後不需要新增任何依賴,萬幸,手動匯入成功
ReactiveCocoa常見類。
01.RACSiganl ,在RAC中最核心的類
RACSiganl:訊號類,一般表示將來有資料傳遞,只要有資料改變,訊號內部接收到資料,就會馬上發出資料。
只是表示當資料改變時,訊號內部會發出資料,它本身不具備傳送訊號的能力,而是交給內部一個訂閱者去發出。
預設一個訊號都是冷訊號,也就是值改變了,也不會觸發,只有訂閱了這個訊號,這個訊號才會變為熱訊號,值改變了才會觸發。
如何訂閱訊號:呼叫訊號RACSignal的subscribeNext就能訂閱。
// 1.建立訊號
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// block呼叫時刻:每當有訂閱者訂閱訊號,就會呼叫block。
// 2.傳送訊號
[subscriber sendNext:@"我是一個訊號類"];
// 如果不在傳送資料,最好傳送訊號完成,內部會自動呼叫[RACDisposable disposable]取消訂閱訊號。
[subscriber sendCompleted];
// block呼叫時刻:當訊號傳送完成或者傳送錯誤,就會自動執行這個block,取消訂閱訊號。
return [RACDisposable disposableWithBlock:^{
// 執行完Block後,當前訊號就不在被訂閱了。
NSLog(@"訊號被銷燬");
}];
}];
self.signal = signal;
// 3.訂閱訊號,才會啟用訊號
[signal subscribeNext:^(id x) {
NSLog(@"接收的資料:%@",x);
}];
02.RACSubscriber:
表示訂閱者的意思,用於傳送訊號,這是一個協議,不是一個類,只要遵守這個協議,並且實現方法才能成為訂閱者。通過create建立的訊號,都有一個訂閱者,幫助他傳送資料。
03.RACDisposable:
用於取消訂閱或者清理資源,當訊號傳送完成或者傳送錯誤的時候,就會自動觸發它。
[RACDisposable disposableWithBlock:^{
// 執行完Block後,當前訊號就不在被訂閱了。
NSLog(@"訊號被銷燬");
}];
04.RACSubject:
RACSubject:訊號提供者,自己可以充當訊號,又能傳送訊號。
RACSubject使用步驟:
- 1.建立訊號 [RACSubject subject],跟RACSiganl不一樣,建立訊號時沒有block。
- 2.訂閱訊號 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 3.傳送訊號 sendNext:(id)value
// 1.建立訊號
RACSubject *subject = [RACSubject subject];
// 2.訂閱訊號
[subject subscribeNext:^(id x) {
// block呼叫時刻:當訊號發出新值,就會呼叫.
NSLog(@"第一個訂閱者:%@",x);
}];
[subject subscribeNext:^(id x) {
// block呼叫時刻:當訊號發出新值,就會呼叫.
NSLog(@"第二個訂閱者:%@",x);
}];
// 3.傳送訊號
[subject sendNext:@"傳送訊號"];
ReactiveCocoa在開發中常見的用法
Event(按鈕的點選)
// 監聽事件
// 把按鈕點選事件轉換為訊號,點選按鈕,就會發送訊號
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"按鈕被點選");
}];
KVO觀察者
// 監聽物件的屬性值改變,轉換成訊號,只要值改變就會發送訊號
[[View rac_valuesAndChangesForKeyPath:@"x" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
NSLog(@"view的x值發生了改變");
}];
Notification通知
// 代替通知
// 把監聽到的通知轉換訊號
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"鍵盤將要出現");
}];
// 通過RAC提供的巨集快速實現觀察者模式
// RACObserve(self, name):監聽某個物件的某個屬性,返回的是訊號。
[RACObserve(self.greenView,x) subscribeNext:^(id x) {
NSLog(@"綠色view的x方向發生改變");
}];
textField的文字訊號
// 監聽文字框的文字改變
[[_textField rac_textSignal] subscribeNext:^(NSString *x) {
NSLog(@"文字框文字發生了改變:%@",x);
}];
// 通過RAC提供的巨集快速實現textSingel的監聽
// RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用於給某個物件的某個屬性繫結。
// 當textField的文字發生改變時,label的文字也發生改變
RAC(self.textLabel,text) = self.textField.rac_textSignal;
手勢訊號
// 監聽手勢
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
[[tapGesture rac_gestureSignal] subscribeNext:^(id x) {
NSLog(@"view被觸發tap手勢");
}];
[self.view addGestureRecognizer:tapGesture];
過濾器filter方法的使用
// 過濾器
[[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
return value.length >= 3;
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
這些只是對 ReactiveCocoa 的初步瞭解以及基本使用,還有更多功能和方法,需要我們去慢慢研究