iOS-RAC的基礎(chǔ)使用

一、RAC簡介

ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架 。

二、RAC的使用

2.1 、如何導(dǎo)入ReactiveCocoa框架。

2.1.1、CocoaPods導(dǎo)入,注:我使用第一種導(dǎo)入方法。

source 'https://github.com/CocoaPods/Specs.git'

platform:ios,'7.0'

target 'RAC_Test' do
    
pod 'ReactiveCocoa'

end

2.1.2、手動導(dǎo)入
因為開發(fā)過程中有些人習(xí)慣直接手動導(dǎo)入,但是ReactiveCocoa在GitHub上并沒有說明需要哪些依賴庫,所以直接把將下載的RactiveCocoa整個文件夾拖到工程,build后,哪里報錯修改哪里,最后手動導(dǎo)入成功。注:開發(fā)過程中主要選擇pod導(dǎo)入,方便管理。

三、RAC常見類

3.1 RACSignal,在RAC中最核心的類

信號類,一般表示將來有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變,信號內(nèi)部接收到數(shù)據(jù),就會馬上發(fā)出數(shù)據(jù)。

注意:

·信號類(RACSiganl),只是表示當(dāng)數(shù)據(jù)改變時,信號內(nèi)部會發(fā)出數(shù)據(jù),它本身不具備發(fā)送信號的能力,而是交給內(nèi)部一個訂閱者去發(fā)出。

·默認(rèn)一個信號都是冷信號,也就是值改變了,也不會觸發(fā),只有訂閱了這個信號,這個信號才會變?yōu)闊嵝盘?,值改變了才會觸發(fā)。

·如何訂閱信號:調(diào)用信號RACSignal的subscribeNext就能訂閱。
3.2 RACSubscriber:

表示訂閱者的意思,用于發(fā)送信號,這是一個協(xié)議,不是一個類,只要遵守這個協(xié)議,并且實現(xiàn)方法才能成為訂閱者。通過create創(chuàng)建的信號,都有一個訂閱者,幫助他發(fā)送數(shù)據(jù)。

3.3 RACDisposable:

用于取消訂閱者或者清理資源,當(dāng)信號發(fā)送完成或者發(fā)送錯誤的時間,都會自動觸發(fā)它。
使用場景:不想監(jiān)聽某個信號時,可以通過它主動取消訂閱信號。

3.4 RACSubject:

信號提供者,自己可以充當(dāng)信號,又能發(fā)送信號。
使用場景:通常用來代替代理,有了它,就不必要定義代理了。

四、RAC 開發(fā)者常用方法

·rac_signalForSelector : 代替代理
·rac_valuesAndChangesForKeyPath: KVO
·rac_signalForControlEvents:監(jiān)聽事件
·rac_addObserverForName 代替通知
·rac_textSignal:監(jiān)聽文本框文字改變
·rac_liftSelector:withSignalsFromArray:Signals:當(dāng)傳入的Signals(信號數(shù)組),每一個signal都至少sendNext過一次,就會去觸發(fā)第一個selector參數(shù)的方法。

使用的時候先導(dǎo)入#import <ReactiveCocoa/ReactiveCocoa.h>

4.1. Event(按鈕點擊)

rac_signalForControlEvents:用于監(jiān)聽某個事件。

// 把按鈕點擊事件轉(zhuǎn)換為信號,點擊按鈕,就會發(fā)送信號
    [[self.textfiled rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
        NSLog(@"change");
    }];
4.2.KVO觀察著

rac_valuesAndChangesForKeyPath:用于監(jiān)聽某個對象的屬性改變。

//監(jiān)聽對象的屬性值改變,轉(zhuǎn)換成信號,只要值改變就會發(fā)送信號
    [[self rac_valuesForKeyPath:@"name" observer:nil] subscribeNext:^(id x) {
        self.textfiled.text =[NSString stringWithFormat:@"%@",self.name];
        NSLog(@"age=%@",self.name);
    }];
4.3.Notification通知

rac_addObserverForName:用于監(jiān)聽某個通知。

//鍵盤彈出
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        NSLog(@"鍵盤彈出");
    }];
4.4.textField的文字信號

rac_textSignal:只要文本框發(fā)出改變就會發(fā)出這個信號。

   // 監(jiān)聽文本框的文字改變
    [[self.textfiled rac_textSignal] subscribeNext:^(NSString *x) {
        NSLog(@"文本框文字發(fā)生了改變:%@",x);
    }];
    //通過RAC提供的宏快速實現(xiàn)textSingel的監(jiān)聽
    // RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于給某個對象的某個屬性綁定。
    // 當(dāng)textField的文字發(fā)生改變時,label的文字也發(fā)生改變
    RAC(self.textLabel,text) = self.textfiled.rac_textSignal;
4.5.手勢信號

rac_gestureSignal] subscribeNext:用于監(jiān)聽手勢

 // 監(jiān)聽手勢
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
    [[tapGesture rac_gestureSignal] subscribeNext:^(id x) {
        NSLog(@"\nview被觸發(fā)tap手勢");
    }];
    [self.view addGestureRecognizer:tapGesture];
    
4.6.過濾filter方法的使用

過濾信號,使用它可以獲取滿足條件的信號.

// 過濾:
// 每次信號發(fā)出,會先執(zhí)行過濾條件判斷.
[_textField.rac_textSignal filter:^BOOL(NSString *value) {
        return value.length > 3;
}];
4.7.ignore:忽略完某些值的信號.
[[_textField.rac_textSignal ignore:@"1"] subscribeNext:^(id x) {
   
   NSLog(@"%@",x);
}];
4.8.RACSequence:RAC中的集合類,用于代替NSArray,NSDictionary,可以使用它來快速遍歷數(shù)組和字典。
 //遍歷數(shù)組
    NSArray *numbers = @[@"45",@"23",@"54",@"65"];
    [numbers.rac_sequence.signal subscribeNext:^(id x) {
        NSLog(@"遍歷后的數(shù)組%@",x);
    }];
    
    
    //遍歷字典
    NSDictionary *dict = @{@"name":@"xomg",@"age":@"18"};
    [dict.rac_sequence.signal subscribeNext:^(id x) {
        RACTupleUnpack_(NSString *key,NSString *value) = x;
        NSLog(@"key=%@ value=%@",key,value);
    }];
4.9.需要幾個地方數(shù)據(jù)請求都完成以后再刷新界面的需求
//處理多個請求,都返回結(jié)果的時候,統(tǒng)一做處理.
    RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      
        [subscriber sendNext:@"發(fā)送請求1"];
        return nil;
    }];
    
    RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"發(fā)送請求2"];
        return nil;
    }];
    
    [self rac_liftSelector:@selector(updateUIWithR1:R2:) withSignalsFromArray:@[request1,request2]];

- (void)updateUIWithR1:(id)data1 R2:(id)data2{
    NSLog(@"\n輸出更新后的數(shù)據(jù):%@     %@",data1,data2);
}

五、ReactiveCocoa常見宏

·RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于給某個對象的某個屬性綁定
·RACObserve(self, name) :監(jiān)聽某個對象的某個屬性,返回的是信號。
·@weakify(Obj)和@strongify(Obj)
·RACTuplePack :把數(shù)據(jù)包裝成RACTuple(元組類)
·RACTupleUnpack:把RACTuple(元組類)解包成對應(yīng)的數(shù)據(jù)
·RACChannelTo 用于雙向綁定的一個終端

5.1RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于給某個對象的某個屬性綁定。

 //常見宏只要文本框文字改變,就會修改label的文字
    RAC(self.textfiled,text) = _textfiled.rac_textSignal;

5.2RACObserve(self, name):監(jiān)聽某個對象的某個屬性,返回的是信號。

 //監(jiān)聽某個對象的某個屬性,返回的是信號
    [RACObserve(self.textfiled, center) subscribeNext:^(id x) {
        NSLog(@"返回的是信號:%@",x);
    }];

六、常用操作方法

6.1、 flattenMap map 用于把源信號內(nèi)容映射成新的內(nèi)容。
6.2、 concat 組合 按一定順序拼接信號,當(dāng)多個信號發(fā)出的時候,有順序的接收信號
6.3、then 用于連接兩個信號,當(dāng)?shù)谝粋€信號完成,才會連接then返回的信號。
6.4、merge 把多個信號合并為一個信號,任何一個信號有新值的時候就會調(diào)用
6.5、zipWith 把兩個信號壓縮成一個信號,只有當(dāng)兩個信號同時發(fā)出信號內(nèi)容時,并且把兩個信號的內(nèi)容合并成一個元組,才會觸發(fā)壓縮流的next事件。
6.6、combineLatest:將多個信號合并起來,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext,才會觸發(fā)合并的信號。
6.7、reduce聚合:用于信號發(fā)出的內(nèi)容是元組,把信號發(fā)出元組的值聚合成一個值
6.8、filter:過濾信號,使用它可以獲取滿足條件的信號.
6.9、ignore:忽略完某些值的信號.
6.10、distinctUntilChanged:當(dāng)上一次的值和當(dāng)前的值有明顯的變化就會發(fā)出信號,否則會被忽略掉。
6.11、take:從開始一共取N次的信號
6.12、takeLast:取最后N次的信號,前提條件,訂閱者必須調(diào)用完成,因為只有完成,就知道總共有多少信號.
6.13、takeUntil:(RACSignal *):獲取信號直到某個信號執(zhí)行完成
6.14、skip:(NSUInteger):跳過幾個信號,不接受。
6.15、switchToLatest:用于signalOfSignals(信號的信號),有時候信號也會發(fā)出信號,會在signalOfSignals中,獲取signalOfSignals發(fā)送的最新信號。
6.16、doNext: 執(zhí)行Next之前,會先執(zhí)行這個Block
6.17、doCompleted: 執(zhí)行sendCompleted之前,會先執(zhí)行這個Block
6.18、timeout:超時,可以讓一個信號在一定的時間后,自動報錯。
6.19、interval 定時:每隔一段時間發(fā)出信號
6.20、delay 延遲發(fā)送next。
6.21、retry重試 :只要失敗,就會重新執(zhí)行創(chuàng)建信號中的block,直到成功.
6.22、replay重放:當(dāng)一個信號被多次訂閱,反復(fù)播放內(nèi)容
6.23、throttle節(jié)流:當(dāng)某個信號發(fā)送比較頻繁時,可以使用節(jié)流,在某一段時間不發(fā)送信號內(nèi)容,過了一段時間獲取信號的最新內(nèi)容發(fā)出。

Git demo https://github.com/yahoouchen/RAC

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容