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架構:布局之前一定要添加到父控件中)有相似之處
文章出處:https://www.cnblogs.com/CoderEYLee/p/6640503.html