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框架:布局之前一定要添加到父控件中)有相似之處



 更多內容--> 博客導航 每周一篇喲!!!

 

 有任何關於iOS開發的問題!歡迎下方留言!!!或者郵件lieryangios@126.com 雖然我不一定能夠解答出來,但是我會請教iOS開發高手!!!解答您的問題!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM