• ReactiveCocoa 谈谈RACMulticastConnection


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

  • 相关阅读:
    CISC和RISC的区别
    常用ARM指令
    ARM汇编指令特点
    DMA(Direct Memory Access直接存储器访问)总结
    三态门(三态缓冲器)的工作原理
    DSP28335 eCAP 测频
    EINT DINT ERTM DRTM EALLOW EDIS ESTOP0的理解
    typedef interrupt void (*PINT)(void)的分析
    DSP28335 GPIO学习
    ECR102E(求减掉最长边加上最短边的最短路)
  • 原文地址:https://www.cnblogs.com/forkasi/p/4886740.html
Copyright © 2020-2023  润新知