ReactiveCocoa 的RACMulticastConnection使用

在项目里,经常会使用这种方式创建一个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一次

1
2
3
[four subscribeNext:^( id  x) {
        NSLog (@ "fristSignal 2" );
    }];

 看上去是没有问题的,但是一跑起来就会发现

1
2
3
4
5
6
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被调用多次的问题就会得到解决

1
2
3
4
5
6
7
8
9
10
11
RACMulticastConnection *connection = [four multicast:[RACReplaySubject subject]];
 
[connection connect];
 
[connection.signal subscribeNext:^( id  x) {
     NSLog (@ "fristSignal 1" );
}];
 
[connection.signal subscribeNext:^( id  x) {
     NSLog (@ "fristSignal 2" );
}];

 结果

1
2
3
4
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重复执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值