ReactiveObjC框架的簡單介紹


 最近在一直在學習RAC框架的Object-C版本ReactiveObjC(Swift版本為ReactiveSwift),這篇文章簡單展示一下學習的成果!!!如果有什么地方理解錯誤,歡迎大家指正!!!互相學習......

ReactiveObjC 這里只是拋磚引玉!!!如果有什么理解不到位的,歡迎批評指正,共同進步!!!

如果你不想了解底層是怎么實現的,那么直接上代碼 -----> ReactiveObjC使用

 

RAC框架中的繼承關系(不包含分類)

 

 

 

 

注意:

1、關於底層實現是三方已經自動幫我們實現的過程,我們只需要,學會使用步驟就行了,當然多了解底層原理有助於我們提升自己的能力!!!

2、不同類型信號的訂閱,處理的事情不一樣。

 

#pragma mark -- RAC/RACSignal

RACSignal使用步驟: 

1、創建信號: + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;

2、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;

3、發送信號:- (void)sendNext:(id)value;

特點:先訂閱,后發送。


RACSignal底層實現:
1、創建信號:把didSubscribe(代碼塊)保存到信號中

2、訂閱信號:調用signal的subscribeNext:(void (^)(id x))nextBlock

3、調用RACDynamicSignal的didSubscribe把訂閱者傳遞過去

4、[subscriber sendNext:@1]; 調用訂閱者的發送消息的方法,發送消息

5、執行nextBlock這個代碼塊

 

代碼實現

 

//1、創建訂閱者
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
    //3、發送信號,發送信號之前一定要先訂閱信號
    [subscriber sendNext:@"1"];
        
    return nil;
}];
    
//2、訂閱信號
[signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"--%@", x);
}];

 

圖例:

 

 

#pragma mark -- RACSubject

RACSubject使用步驟: 

1、創建信號: + (instancetype)subject;

2、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;

3、發送信號:- (void)sendNext:(id)value;

特點:先訂閱,后發送。

 


RACSubject底層實現
1.調用subscribeNext訂閱信號,把訂閱者保存起來,並且訂閱者的nextBlock中已經賦值了。
2.調用sendNext發送信號,遍歷剛剛保存的所有訂閱者,分別調用訂閱者的nextBlock。

 

代碼實現:

 

   //1.創建信號
    RACSubject *subject = [RACSubject subject];
    
    //2.訂閱信號
    [subject subscribeNext:^(id x) {
      // block調用時刻:當信號發出新值,就會調用.
      NSLog(@"第一個訂閱者%@",x);
    }];
    
    [subject subscribeNext:^(id x) {
      // block調用時刻:當信號發出新值,就會調用.
      NSLog(@"第二個訂閱者%@",x);
    }];
    
    //3.發送信號
    [subject sendNext:@"1"];

 

圖例:

 

#pragma mark -- RACReplaySubject

RACReplaySubject使用步驟:

1、創建信號: + (instancetype)subject;

2/3、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;

3/2、發送信號:- (void)sendNext:(id)value;

特點:可以先訂閱信號,也可以先發送信號

 

RACReplaySubject底層實現

1.調用sendNext發送信號,把需要發送的信號保存起來,然后遍歷剛剛保存的所有訂閱者,一個一個調用訂閱者的nextBlock。
2.調用subscribeNext訂閱信號,遍歷保存的所有值,一個一個調用訂閱者的nextBlock

如果想要當一個信號被訂閱,就重復播放之前所有值,需要先發送信號,在訂閱信號。(也就是先保存值,再訂閱值。)


代碼實現:(先發送后訂閱)

  // 1.創建信號
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    // 2.發送信號
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];
    
    // 3.訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第一個訂閱者接收到的數據%@",x);
    }];
    
    // 訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第二個訂閱者接收到的數據%@",x);
    }];

 

控制台打印:(先發送后訂閱)

每一個訂閱者接收全部信號(信號已經全部保存完畢) 

第一個訂閱者接收到的數據1
第一個訂閱者接收到的數據2
第二個訂閱者接收到的數據1
第二個訂閱者接收到的數據2

 

 圖例:(先發送后訂閱)

 

 

代碼實現:(先訂閱后發送)

 

    // 1.創建信號
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    // 2.訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第一個訂閱者接收到的數據%@",x);
    }];
    
    // 訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第二個訂閱者接收到的數據%@",x);
    }];
    
    // 3.發送信號
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];

 

控制台打印:(先訂閱后發送)

全部訂閱者接收同一個信號(訂閱者已經全部保存完畢) 

第一個訂閱者接收到的數據1
第二個訂閱者接收到的數據1
第一個訂閱者接收到的數據2
第二個訂閱者接收到的數據2

 

圖例:(先訂閱后發送)

 

  

如果你不想了解底層是怎么實現的,那么直接上代碼 -----> ReactiveObjC使用

 

 

 

 

 

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

 

 

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


免責聲明!

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



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