美文网首页
ReactiveObjC框架学习及简单介绍

ReactiveObjC框架学习及简单介绍

作者: Felix的笔头 | 来源:发表于2018-01-19 18:49 被阅读0次

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

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

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


    1129722-20170703211823972-622987082.png

    注意:

    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:@"RAC signal"];
            return nil;
        }];
        
        //2. 订阅信号
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"---%@",x);
        }];
        
        //控制台打印: ---RAC signal
    

    图例


    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
    

    图例


    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
    

    图例:(先发送后订阅)


    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
    

    图例:(先订阅后发送)


    1129722-20170703201414019-812141403.png

    相关文章

      网友评论

          本文标题:ReactiveObjC框架学习及简单介绍

          本文链接:https://www.haomeiwen.com/subject/evlaoxtx.html