为什么 [RACLifting rac_liftSelector:] 在案例 A 和 B 之间打印不同的结果

Why does [RACLifting rac_liftSelector:] print different results between case A and B

为什么 [RACLifting rac_liftSelector:] 在情况 A 和 B 之间打印不同的结果

- (void)test
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [subscriber sendNext:@"A"];
    });
    return nil;
}];

RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {


//        {//case A:
//            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//                [subscriber sendNext:@"B"];
//                [subscriber sendNext:@"Another B"];
//                [subscriber sendNext:@"Another Bbbbb"];
//            });
//        }


    {//case B:
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [subscriber sendNext:@"B"];
            [subscriber sendNext:@"Another B"];
            [subscriber sendNext:@"Another Bbbbb"];
        });
    }

    return nil;
}];

[self rac_liftSelector:@selector(doA:withB:) withSignals:signalA, signalB, nil];
}

- (void)doA:(NSString *)A withB:(NSString *)B
{
    NSLog(@"A:%@ and B:%@", A, B);
}

如案例A和案例B,只有一个different:the延迟时间从1秒变为3秒。 但在 A 的情况下,NSLog 只出现一次

2015-07-16 10:55:28.837 ReactiveCocoa[2563:581353] A:A and B:Another Bbbbb

然后在情况 B 中,它的 NSLog 是

的三倍
2015-07-16 10:55:26.819 ReactiveCocoa[2563:581353] A:A and B:B
2015-07-16 10:55:28.836 ReactiveCocoa[2563:581353] A:A and B:Another B
2015-07-16 10:55:28.837 ReactiveCocoa[2563:581353] A:A and B:Another Bbbbb

谁能帮帮我?

rac_liftSelector 的工作方式与 combineLatestRACSignal 的工作方式相同,它会等待每个信号在触发前发送事件。

因为signalA两秒不开火,而且只发送一个事件,所以它本质上是doA:withB:开火的看门人。无论 signalA 何时触发,它的单个事件都不会丢失。

另一方面,

signalB 发送多个事件。在每隔 RACSignal 次触发(即 signalA)之前发送的每个事件都将丢失,除了最近的事件。

因此,当 rac_liftSelector 在 "case A:" 中等待 signalA 触发时,事件不会被缓冲。 doA:withB: 的第一次调用将仅传递来自每个信号的最新事件,但从那时起将继续传递每个信号的每个事件。