zoukankan      html  css  js  c++  java
  • 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开发高手!!!解答您的问题!!!

  • 相关阅读:
    指针和引用的区别
    c++空指针 和 野指针
    strcpy源码实现方式
    函数的分文件编写
    哈夫曼编码实现
    错误:The selected wizard could not be started Plug-in com.genuitec.eclipse.j2ee.ui was unable to load class com.genuitec.eclipse.j2ee.ui.wizard.WebProjectWizard
    sql server,mysql 和navicat for mysql的区别
    MySQL 5.7
    sql server 2017
    Download
  • 原文地址:https://www.cnblogs.com/CoderEYLee/p/Object-C-0010.html
Copyright © 2011-2022 走看看