ReactiveObjC框架学习及简单介绍

最近在一直在学习RAC框架的Object-C版本ReactiveObjC(Swift版本为ReactiveSwift),这篇文章简单展示一下学习的成果!!!如果有什么地方理解错误,欢迎大家指正!!!互相学习......

ReactiveObjC 这里只是抛砖引玉!!!如果有什么理解不到位的,欢迎批评指正,共同进步!!!

RAC框架中的继承关系(不包含分类)


ReactiveObjC框架学习及简单介绍_第1张图片
1129722-20170703211823972-622987082.png

注意:

1、关于底层实现是三方已经自动帮我们实现的过程,我们只需要,学会使用步骤就行了,当然多了解底层原理有助于我们提升自己的能力!!!

2、不同类型信号的订阅,处理的事情不一样。

pragma mark -- RAC/RACSignal

RACSignal使用步骤:

1、创建信号: + (RACSignal *)createSignal:(RACDisposable * (^)(id 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  _Nonnull subscriber) {
        //3.发送信号 ,发送信号之前一定要先订阅信号
        [subscriber sendNext:@"RAC signal"];
        return nil;
    }];
    
    //2. 订阅信号
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"---%@",x);
    }];
    
    //控制台打印: ---RAC signal

图例


ReactiveObjC框架学习及简单介绍_第2张图片
1129722-20170629191936321-1388848008.png

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  _Nullable x) {
       //block 调用时刻 : 当信号发出新值 ,就会调用
        NSLog(@"第一个订阅者 %@",x);
    }];
    
    [subject subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"第二个订阅者 %@",x);
    }];
    
    //3.发送信号
    [subject sendNext:@"RACSubject"];
    
   //控制台打印: 第一个订阅者 RACSubject
                 第二个订阅者 RACSubject

图例


ReactiveObjC框架学习及简单介绍_第3张图片
1129722-20170629225320243-164179572.png

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

图例:(先发送后订阅)


ReactiveObjC框架学习及简单介绍_第4张图片
1129722-20170703200338315-1560237486.png
//代码实现(先订阅,后发送 )

// 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框架学习及简单介绍_第5张图片
1129722-20170703201414019-812141403.png

你可能感兴趣的:(ReactiveObjC框架学习及简单介绍)