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开发高手!!!解答您的问题!!!

posted on   人生为代码而活  阅读(5737)  评论(2编辑  收藏  举报

努力加载评论中...

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示