ReactiveObjC使用 ReactiveCocoa是Github開源的一個用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱。敢自稱為XXXCocoa框架可以想象到這個框架的牛逼! 現在分為ReactiveObjC和ReactiveSwift,兩個框架的功能使用相似,本文主要介紹Re ...
ReactiveObjC使用
ReactiveCocoa是Github開源的一個用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱。敢自稱為XXXCocoa框架可以想象到這個框架的牛逼!
現在分為ReactiveObjC和ReactiveSwift,兩個框架的功能使用相似,本文主要介紹ReactiveObjC的簡單使用,希望能對你有所幫助......
ReactiveObjC框架的簡單使用
如果是第一次使用,建議先簡單測試通過後,再使用...... (你懂的) ReactiveObjC框架的簡單介紹
#pragma mark -- 監聽事件(按鈕點擊)
原理:將系統的UIControlEventTouchUpInside事件轉化為信號、我們只需要訂閱該信號就可以了。
點擊按鈕的時候觸發UIControlEventTouchUpInside事件---> 發出信號 實際是: 執行訂閱者(subscriber)的sendNext方法
// 外界使用 [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { //x 就是被點擊的按鈕 NSLog(@"按鈕被點擊了%@", x); }];
圖例:
#pragma mark -- 代替代理
需求:自定義redView,監聽紅色view中按鈕點擊
之前都是需要通過代理監聽,給紅色View添加一個代理屬性,點擊按鈕的時候,通知代理做事情,符合封裝的思想。
rac_signalForSelector:把調用某個對象的方法的信息轉換成信號(RACSubject),就會調用這個方法,就會發送信號。
這裡表示只要監聽了redView的btnClick:方法。(只要redView的btnClick:方法執行了,就會執行下麵的方法,並且將參數傳遞過來)
[[redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) { NSLog(@"點擊紅色視圖中的按鈕", x); }];
#pragma mark -- 代替KVO
// 把監聽redView的center屬性改變轉換成信號,只要值改變就會發送信號
// observer:可以傳入nil
[[redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"%@",x); }];
#pragma mark -- 代替通知
// 把監聽到的通知轉換信號
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(NSNotification * _Nullable x) { NSLog(@"%@", x); }];
#pragma mark -- 監聽文本框的文字改變
// 監聽文本框的文字改變、獲取文本框文字改變的信號
[_textField.rac_textSignal subscribeNext:^(id x) { self.textLabel.text = x; NSLog(@"文字改變了%@",x); }];
#pragma mark -- 處理多個請求
// 處理多個請求,都返回結果的時候,統一做處理.
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發送請求1
[subscriber sendNext:@"發送請求1"];
return nil;
}];
RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發送請求2
[subscriber sendNext:@"發送請求2"];
return nil;
}];
// 使用註意:幾個信號,selector的方法就幾個參數,每個參數對應信號發出的數據。
不需要訂閱:不需要主動訂閱,內部會主動訂閱
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
// 更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
NSLog(@"更新UI%@ %@",data,data1);
}
#pragma mark -- 遍曆數組
// 1.遍曆數組
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); }];
***********************************************RAC常用巨集*****************************************
#pragma mark--KVO
RACObserve(就是一個巨集定義):快速的監聽某個對象的某個屬性改變
監聽self.view的center屬性,當center發生改變的時候就會觸發NSLog方法
[RACObserve(self.view, center) subscribeNext:^(id x) { NSLog(@"%@", x); }];
#pragma mark--登錄按鈕的狀態實時監聽
RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){ return @(username.length && password.length); }];
#pragma mark--迴圈引用
// @weakify() 巨集定義
@weakify(self) //相當於__weak typeof(self) weakSelf = self;
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { @strongify(self) //相當於__strong typeof(weakSelf) strongSelf = weakSelf; NSLog(@"%@",self.view); return nil; }]; _signal = signal;
實際開發遇到的坑
一: "引用迴圈"是肯定會出現的,因此一定要避免"強引用迴圈"
解決方案:一端使用strong一端使用weak
二: 出現下麵的錯誤:
解決辦法:所有控制項在使用RAC之前一定要先初始化!先初始化!先初始化!
(Masonry框架:佈局之前一定要添加到父控制項中)有相似之處