1. 程式人生 > >iOS-ReactiveCocoa(RAC)的初步瞭解以及基本使用

iOS-ReactiveCocoa(RAC)的初步瞭解以及基本使用

這裡寫圖片描述

ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架
Github-ReactiveCocoa地址

一直聽說RAC,但一直未使用過,最近不算忙,研究和學習了一下,非常感謝
崢吖大神對RAC 的細解,受益匪淺。

ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架。

擷取Github上對ReactiveCocoa的說明:

這裡寫圖片描述

RAC是提供事件流,通過訊號源和訊號源提供者(產生者),訊號接受者協和來完成。
借用面向物件的一句話,萬物皆是流的形式,通過一方發出訊號,一方接受訊號來完成不同事件。

ReactiveCocoa作用

  • 代理方法
  • block 回撥
  • 通知
  • 行為控制和事件的響應鏈
  • 協議
  • KVO
  • ……
主要作用:

高內聚,低耦合,使程式碼更加內聚,也便於程式碼的讀取

響應式程式設計思想:

不需要考慮呼叫順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用面向物件的一句話,萬物皆是流。

函數語言程式設計思想:

是把操作儘量寫成一系列巢狀的函式或者方法呼叫。
特點:每個方法必須有返回值(本身物件),把函式或者Block當做引數,block參
數(需要操作的值)block返回值(操作結果)。

ReactiveCocoa程式設計風格:

ReactiveCocoa結合了 函數語言程式設計(Functional Programming)和 響應式程式設計(Reactive Programming)各自的優點,產生一種新的語法

如何匯入ReactiveCocoa框架
1.CocoaPods

pod 'ReactiveCocoa'

這裡寫圖片描述
有的需要在podfile中加入use_frameworks!,到時候終端會提醒的
我匯入時需要加入target,如圖所示

2.手動匯入
由於工程之前一直是手動匯入第三方框架,所以也希望手動新增ReactiveCocoa這個框架,但ReactiveCocoa在GitHub上並沒有說明如何新增,需要哪些依賴等,所以自己直接把ReactiveCocoa整個資料夾拖到工程中,build以後,哪裡報錯修改哪裡,最後不需要新增任何依賴,萬幸,手動匯入成功

ReactiveCocoa常見類。

01.RACSiganl ,在RAC中最核心的類

  • RACSiganl:訊號類,一般表示將來有資料傳遞,只要有資料改變,訊號內部接收到資料,就會馬上發出資料。

  • 只是表示當資料改變時,訊號內部會發出資料,它本身不具備傳送訊號的能力,而是交給內部一個訂閱者去發出。

  • 預設一個訊號都是冷訊號,也就是值改變了,也不會觸發,只有訂閱了這個訊號,這個訊號才會變為熱訊號,值改變了才會觸發。

  • 如何訂閱訊號:呼叫訊號RACSignal的subscribeNext就能訂閱。

    // 1.建立訊號
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // block呼叫時刻:每當有訂閱者訂閱訊號,就會呼叫block。

        // 2.傳送訊號
        [subscriber sendNext:@"我是一個訊號類"];
        // 如果不在傳送資料,最好傳送訊號完成,內部會自動呼叫[RACDisposable disposable]取消訂閱訊號。
        [subscriber sendCompleted];
        // block呼叫時刻:當訊號傳送完成或者傳送錯誤,就會自動執行這個block,取消訂閱訊號。
        return [RACDisposable disposableWithBlock:^{
            // 執行完Block後,當前訊號就不在被訂閱了。
            NSLog(@"訊號被銷燬");
        }];
    }];
    self.signal = signal;

    // 3.訂閱訊號,才會啟用訊號
    [signal subscribeNext:^(id x) {
        NSLog(@"接收的資料:%@",x);
    }];

02.RACSubscriber:

表示訂閱者的意思,用於傳送訊號,這是一個協議,不是一個類,只要遵守這個協議,並且實現方法才能成為訂閱者。通過create建立的訊號,都有一個訂閱者,幫助他傳送資料。

03.RACDisposable:

用於取消訂閱或者清理資源,當訊號傳送完成或者傳送錯誤的時候,就會自動觸發它。

[RACDisposable disposableWithBlock:^{
    // 執行完Block後,當前訊號就不在被訂閱了。
    NSLog(@"訊號被銷燬");
}];

04.RACSubject:

RACSubject:訊號提供者,自己可以充當訊號,又能傳送訊號。
RACSubject使用步驟:

  • 1.建立訊號 [RACSubject subject],跟RACSiganl不一樣,建立訊號時沒有block。
  • 2.訂閱訊號 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
  • 3.傳送訊號 sendNext:(id)value
// 1.建立訊號
    RACSubject *subject = [RACSubject subject];
    // 2.訂閱訊號
    [subject subscribeNext:^(id x) {
        // block呼叫時刻:當訊號發出新值,就會呼叫.
        NSLog(@"第一個訂閱者:%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block呼叫時刻:當訊號發出新值,就會呼叫.
        NSLog(@"第二個訂閱者:%@",x);
    }];
    // 3.傳送訊號
    [subject sendNext:@"傳送訊號"];

ReactiveCocoa在開發中常見的用法

Event(按鈕的點選)

    // 監聽事件
    // 把按鈕點選事件轉換為訊號,點選按鈕,就會發送訊號
    [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        NSLog(@"按鈕被點選");
    }];

KVO觀察者

    // 監聽物件的屬性值改變,轉換成訊號,只要值改變就會發送訊號
    [[View rac_valuesAndChangesForKeyPath:@"x" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
        NSLog(@"view的x值發生了改變");
    }];

Notification通知

    // 代替通知
    // 把監聽到的通知轉換訊號
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        NSLog(@"鍵盤將要出現");
    }];

    // 通過RAC提供的巨集快速實現觀察者模式
    // RACObserve(self, name):監聽某個物件的某個屬性,返回的是訊號。
    [RACObserve(self.greenView,x) subscribeNext:^(id x) {
        NSLog(@"綠色view的x方向發生改變");
    }];

textField的文字訊號

    // 監聽文字框的文字改變
    [[_textField rac_textSignal] subscribeNext:^(NSString *x) {
        NSLog(@"文字框文字發生了改變:%@",x);
    }];

    // 通過RAC提供的巨集快速實現textSingel的監聽
    // RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用於給某個物件的某個屬性繫結。
    // 當textField的文字發生改變時,label的文字也發生改變
    RAC(self.textLabel,text) = self.textField.rac_textSignal;

手勢訊號

    // 監聽手勢
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
    [[tapGesture rac_gestureSignal] subscribeNext:^(id x) {
        NSLog(@"view被觸發tap手勢");
    }];
    [self.view addGestureRecognizer:tapGesture];

過濾器filter方法的使用

    // 過濾器
    [[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
        return value.length >= 3;
    }] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];

這些只是對 ReactiveCocoa 的初步瞭解以及基本使用,還有更多功能和方法,需要我們去慢慢研究