这个简单的`-flattenMap` ReactiveCocoa 代码有什么问题?
What is wrong with this simple `-flattenMap` ReactiveCocoa code?
多次阅读 -flattenMap
上的自述文件后,我仍然无法弄清楚为什么这段代码没有按预期执行。我应该认为块内的代码会 运行 两次,但它根本没有被击中。我真的错过了一些愚蠢的东西吗? (我使用的是 v2.4.7)我还尝试在调用 -flattenMap
后发送值,以防这是一个订单问题。没有骰子。
RACSubject *test = [[RACSubject alloc] init];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}];
两件事:
顺序很重要,因为这是一个主题,所以将其更改为:
RACSubject *test = [[RACSubject alloc] init];
[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
现在,您仍然看不到任何内容 -- 因为您尚未订阅。您只是创建了一个信号,表明 可以 执行所有这些操作,但它会延迟实际执行任何工作,直到您提出要求。
RACSubject *test = [[RACSubject alloc] init];
[[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}] subscribeNext:^(id value) {
NSLog(@"got a %@", value);
}];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
现在,由于有一个订阅者真正想知道值,因此 send
将在适当时触发。
将来,请避免在 subscribe*
和 do*
系列方法的块之外的任何地方放置副作用(如日志记录)。 flattenMap
和其他组合器希望是纯粹的,因此如果您违反了这一点,您将看到类似这样的意外行为。
您可能知道这一点,并且只是在测试 flattenMap
,但是您的代码可以在这里简化为 map
-- flattenMap
+ return
= = map
.
多次阅读 -flattenMap
上的自述文件后,我仍然无法弄清楚为什么这段代码没有按预期执行。我应该认为块内的代码会 运行 两次,但它根本没有被击中。我真的错过了一些愚蠢的东西吗? (我使用的是 v2.4.7)我还尝试在调用 -flattenMap
后发送值,以防这是一个订单问题。没有骰子。
RACSubject *test = [[RACSubject alloc] init];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}];
两件事:
顺序很重要,因为这是一个主题,所以将其更改为:
RACSubject *test = [[RACSubject alloc] init];
[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
现在,您仍然看不到任何内容 -- 因为您尚未订阅。您只是创建了一个信号,表明 可以 执行所有这些操作,但它会延迟实际执行任何工作,直到您提出要求。
RACSubject *test = [[RACSubject alloc] init];
[[test flattenMap:^RACStream *(id value) {
NSLog(@"here: %@", value);
return [RACSignal return:@NO];
}] subscribeNext:^(id value) {
NSLog(@"got a %@", value);
}];
[test sendNext:@1];
[test sendNext:@2];
[test sendCompleted];
现在,由于有一个订阅者真正想知道值,因此 send
将在适当时触发。
将来,请避免在 subscribe*
和 do*
系列方法的块之外的任何地方放置副作用(如日志记录)。 flattenMap
和其他组合器希望是纯粹的,因此如果您违反了这一点,您将看到类似这样的意外行为。
您可能知道这一点,并且只是在测试 flattenMap
,但是您的代码可以在这里简化为 map
-- flattenMap
+ return
= = map
.