本文出处: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重复执行

ReactiveCocoa 谈谈RACMulticastConnection的更多相关文章

  1. ReactiveCocoa 谈谈concat

    今天的一个业务流程,业务流程大概就是这样的 1.从CoreData中获取之前的数据 2.更新界面 3.从网络获取数据 4.判断获取结果 5.处理错误判断 6.更新界面 7.判断结果numberOfNe ...

  2. RAC & MVVM 学习资料整理

    最后更新:2017-01-23 参考链接: MVVM奇葩说 MVVM 介绍 Model-View-ViewModel for iOS [译] 唐巧--被误解的 MVC 和被神化的 MVVM React ...

  3. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  4. ReactiveCocoa学习

    ReactiveCocoa常见类 6.1RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据. 注意: 信号类(RACSiganl),只是表示当数据 ...

  5. IOS ReactiveCocoa

    一 前提: 在iOS开发过程中,当某些事件响应时,需处理的某些业务逻辑 Eg. 按钮点击:action ScrollView滚动:delegate 属性值改变:KVO ReactiveCocoa为事件 ...

  6. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

  7. ReactiveCocoa学习总结

    最近一直断断续续学习关于ReactiveCocoa的知识内容,对于它的一些基础内容将通过本文进行一个总结,主要是一些入门知识 一:RACSignal一些运用 @interface RACSignalT ...

  8. ReactiveCocoa基础知识内容

    本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...

  9. ReactiveCocoa比较区分replay, replayLast和replayLazily

    一直搞不清楚replayLazily和replay的区别可以直接跳到最后看. 原文:http://spin.atomicobject.com/2014/06/29/replay-replaylast- ...

随机推荐

  1. 【转】由DFT推导出DCT

    原文地址:http://blog.sina.com.cn/s/blog_626631420100xvxd.htm 已知离散傅里叶变换(DFT)为: 由于许多要处理的信号都是实信号,在使用DFT时由于傅 ...

  2. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  3. Clean Code – Chapter 6 Objects and Data Structures

    Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...

  4. Linux 下svn恢复到某一版本

    经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看历史 ...

  5. linux内核奇遇记之md源代码解读之四

    linux内核奇遇记之md源代码解读之四 转载请注明出处:http://blog.csdn.net/liumangxiong 运行阵列意味着阵列经历从无到有,建立了作为一个raid应有的属性(如同步重 ...

  6. [struts2]struts标签遍历map[转]

    转至:http://hanxin0311.iteye.com/blog/1745792 private Map<String, String> strMap = new HashMap&l ...

  7. Excel引用

    Excel引用 1.绝对引用  相对引用 A:A   左右拉的话会自动变为  B:B,C:C等等 $A:$A  左右拉的话仍然是A列 A$1:A1  上下拉的话,会变成A$1:A2,A$1:A3等等

  8. 使用tomcat的jndi方式连接mysql的字符编码设置

    最近新项目使用tomcat中配置jndi连接mysql的方式,在使用过程中发现查询条件为中文的时候查询不出结果,经过一通折腾,发现是jndi在连接数据库的时候忘记设置字符编码. 修改之后的完整配置如下 ...

  9. eclipse设置快捷键sysout+Alt+/后出System.out.println!亲測可用!

    曾经一直用myeclipse,没有这方面的顾虑,如今换到了eclipse,非常多要自己设置了,比方非常多快捷键. 最经常使用的,执行到sysout ,eclipse总是不自己主动补全,非常是恼火!!! ...

  10. C# 以ThreadStart方式实现多线程

      3.1 使用ThreadStart委托 这 里先以一个例子体现一下多线程带来的好处,首先在Message类中建立一个方法ShowMessage(),里面显示了当前运行线程的Id,并使用 Threa ...