美文网首页
1.RAC之RACSignal

1.RAC之RACSignal

作者: Terrnce | 来源:发表于2017-05-27 17:50 被阅读30次

    ReactiveCocoa 作为GitHub出品一个重量级的框架,即使目前公司还没用MVVM+RAC架构,但是学习一下ReactiveCocoa还是很有必要的。在此,记录下我学习ReactiveCocoa的行程。

    RACSignal 使用步骤:

    • 步骤1:创建信号
      +(RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;

    • 步骤2:订阅信号,只有订阅了信号,才会激活信号
      -(RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;

    • 步骤3:发送信号
      -(void)sendNext:(id)value;

    例子

    // 步骤1.创建信号
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            
            // block调用时刻:当执行下面步骤2订阅信号的时候,就会调用当前这个block
            
            // 步骤3.发送信号
            // [subscriber sendNext:@1];
            
             // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
            [subscriber sendCompleted];
            
            
            return [RACDisposable disposableWithBlock:^{
               
                //block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
                
                
                // 执行完Block后,当前信号就不在被订阅了。
                
                NSLog(@"信号被销毁");
            }];
        }];
        
        // 步骤2.订阅信号,才会激活信号
        [signal subscribeNext:^(id x) {
            
            // block调用时刻:当执行上面步骤3 发送信号的时候,就会调用当前这个block
             NSLog(@"接收到数据:%@",x);
        }];
    

    看一下RACSignal底层做了些什么

    command + click 进入 createSignal(创建信号) 内部查看底层做了什么

    屏幕快照 2017-05-27 上午1.44.16.png
    屏幕快照 2017-05-27 上午1.55.25.png

    从上面可以看出,RACSignal createSignal: 其实是在底层创建了一个 RACDynamicSignal 信号类对象,并将参数didSubscribe (block)保存到这个RACDynamicSignal信号类对象中 (signal->_didSubscribe = [didSubscribe copy])。

    command + click 进入 subscribeNext(订阅信号) 内部

    屏幕快照 2017-05-27 上午2.15.55.png

    可以看到, subscribeNext 在底层帮我们创建了一个 RACSubscriber 订阅者, RACSubscriber 订阅者 用来保存 nextBlock。接着继续查看 subscribe 内部

    屏幕快照 2017-05-27 上午2.17.28.png

    点击subscribe 方法发现有很多个对象都调用了 subscribe 这个方法,但是,我们上面已经说过了,RACSignal底层其实创建的是 RACDynamicSignal 对象,所以,我们选择 RACDynamicSignal subscribe:

    屏幕快照 2017-05-27 上午2.16.12.png

    主要看我标识的那里,self.didSubscribe 就是前面 createSignal 保存的block,然后就调用这个block。

    最后,看一下 sendNext:(订阅者发送信号) 内部发生了什么

    屏幕快照 2017-05-27 上午2.35.33.png

    非常简单,一目了然,就是直接调用放在 RACSubscriber 订阅者中的 nextBlock.

    总结RACSignal:

    1.创建信号,其实就是创建一个RACDynamicSignal,并把传入的 didSubscribe(),didSubscribe 是一个block, 保存在 RACDynamicSignal中。

    didSubscribe (block)定义: (RACDisposable * (^)(id<RACSubscriber> subscriber)) didSubscribe 
    返回一个 RACDisposable对象,参数是一个 RACSubscriber 订阅者对象
    

    2.订阅信号,有两步
    2-1:创建一个 RACSubscriber 订阅者对象,把nextBlock保存到这个订阅者对象中。
    2-2:调用 保存在 RACDynamicSignal 中的 didSubscribe(), RACSubscriber 作为 didSubscribe 的参数。

    1. 订阅者发送信号
      订阅者直接调用保存的nextBlock().

    相关文章

      网友评论

          本文标题:1.RAC之RACSignal

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