gpt4 book ai didi

ios - 为什么 [RACLifting rac_liftSelector :] print different results between case A and B

转载 作者:行者123 更新时间:2023-12-01 15:44:57 26 4
gpt4 key购买 nike

为什么 [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 的情况只有一个不同:延迟时间从 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 在“情况 A:”中等待 signalA 触发时,事件不会被缓冲。 doA:withB: 的第一次调用将仅传递来自每个信号的最新事件,但从那时起将继续传递每个信号的每个事件。

关于ios - 为什么 [RACLifting rac_liftSelector :] print different results between case A and B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com