1.RAC之RACSignal
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 的参数。
- 订阅者发送信号
订阅者直接调用保存的nextBlock().