1.RAC之RACSignal

2017-05-27  本文已影响30人  Terrnce

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

RACSignal 使用步骤:

例子

// 步骤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().
上一篇下一篇

猜你喜欢

热点阅读