天天看點

ReactiveObjc 的使用

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);
}];      

圖例:

ReactiveObjc 的使用

#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

二: 出現下面的錯誤:

ReactiveObjc 的使用

解決辦法:所有控件在使用RAC之前一定要先初始化!先初始化!先初始化!

(Masonry架構:布局之前一定要添加到父控件中)有相似之處

文章出處:https://www.cnblogs.com/CoderEYLee/p/6640503.html

繼續閱讀