为什么 [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
的工作方式与 combineLatest
对 RACSignal
的工作方式相同,它会等待每个信号在触发前发送事件。
因为signalA
两秒不开火,而且只发送一个事件,所以它本质上是doA:withB:
开火的看门人。无论 signalA
何时触发,它的单个事件都不会丢失。
另一方面,signalB
发送多个事件。在每隔 RACSignal
次触发(即 signalA
)之前发送的每个事件都将丢失,除了最近的事件。
因此,当 rac_liftSelector
在 "case A:" 中等待 signalA
触发时,事件不会被缓冲。 doA:withB:
的第一次调用将仅传递来自每个信号的最新事件,但从那时起将继续传递每个信号的每个事件。
为什么 [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
的工作方式与 combineLatest
对 RACSignal
的工作方式相同,它会等待每个信号在触发前发送事件。
因为signalA
两秒不开火,而且只发送一个事件,所以它本质上是doA:withB:
开火的看门人。无论 signalA
何时触发,它的单个事件都不会丢失。
signalB
发送多个事件。在每隔 RACSignal
次触发(即 signalA
)之前发送的每个事件都将丢失,除了最近的事件。
因此,当 rac_liftSelector
在 "case A:" 中等待 signalA
触发时,事件不会被缓冲。 doA:withB:
的第一次调用将仅传递来自每个信号的最新事件,但从那时起将继续传递每个信号的每个事件。