ReactiveCocoa 谈谈RACMulticastConnection
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ReactiveCocoa 谈谈RACMulticastConnection,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2437字,纯文字阅读大概需要4分钟。
内容图文
本文出处:http://www.cnblogs.com/forkasi/p/4886740.html
在项目里,经常会使用这种方式创建一个signal 然后next
RACSignal *four = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { NSLog(@"oneSignal createSignal"); [subscriber sendNext:@""]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ NSLog(@"oneSignal dispose"); }]; }]; [four subscribeNext:^(id x) { NSLog(@"fristSignal 1"); }];
有时候我们会想顺序操作分割业务,在原来的signal对象上再next一次
[four subscribeNext:^(id x) { NSLog(@"fristSignal 2"); }];
看上去是没有问题的,但是一跑起来就会发现
2015-10-17 00:06:20.050 conatAndThen[4518:2969779] oneSignal createSignal 2015-10-17 00:06:20.051 conatAndThen[4518:2969779] fristSignal 1 2015-10-17 00:06:20.052 conatAndThen[4518:2969779] oneSignal dispose 2015-10-17 00:06:20.053 conatAndThen[4518:2969779] oneSignal createSignal 2015-10-17 00:06:20.053 conatAndThen[4518:2969779] fristSignal 2 2015-10-17 00:06:20.053 conatAndThen[4518:2969779] oneSignal dispose
createSignal 被调用两次,来看看这是为什么
1.createSignal传入createBlock 返回 一个RACDynamicSignal 对象
这个对象保存了didSubscrib的block
2.在subscribNext中传入nextBlock创建一个RACSubscriber对象
3.执行subscribe这个方法
在subscribe中 调用了didSubscribe
并将保存了nextBlock的RACSubscriber对象
4.如果在createBlock中调用了subsribe sendNext的话 subscribe就会调用传入的nextBlock
总的来说
我们在createBlock经常看到的id<RACSubscriber> subscriber
这个subsriber就是在subsrbeNext时创建的,每次执行subscribeNext都会调用createBlock
,这就不难理解为什么createBlock为什么会重复执行
这根本就是不同的RACSubscriber
RAC 通过RACSignal 的multicast 方法来解决这个问题
这个方法返回一个RACMulticastConnection对象 调用connect 方法后,再获取signal属性,createBlock被调用多次的问题就会得到解决
RACMulticastConnection *connection = [four multicast:[RACReplaySubject subject]]; [connection connect]; [connection.signal subscribeNext:^(id x) { NSLog(@"fristSignal 1"); }]; [connection.signal subscribeNext:^(id x) { NSLog(@"fristSignal 2"); }];
结果
2015-10-17 00:16:55.053 conatAndThen[4576:2977593] oneSignal createSignal 2015-10-17 00:16:55.054 conatAndThen[4576:2977593] oneSignal dispose 2015-10-17 00:16:55.055 conatAndThen[4576:2977593] fristSignal 1 2015-10-17 00:16:55.056 conatAndThen[4576:2977593] fristSignal 2
来看看RACMulticastConnection是怎么解决问题的
mulitcast 这个方法,首先就创建了一个RACMulticastConnection对象保存参数起来
connect 方法里面会对sourceSignal subscribe 也就是执行createBlock
所以我们看到是fristSignal 1比dispose先一步执行
这时我们在后续操作的subscriNext的signal已经不是原来的signal了,
而是didsubscribeBlock为空的signal,所以不管后面有多少次subscribNext都不会让createBlock重复执行
原文:http://www.cnblogs.com/forkasi/p/4886740.html
内容总结
以上是互联网集市为您收集整理的ReactiveCocoa 谈谈RACMulticastConnection全部内容,希望文章能够帮你解决ReactiveCocoa 谈谈RACMulticastConnection所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。