这个简单的`-flattenMap` ReactiveCocoa代码出了什么问题?

时间:2015-04-24 06:52:08

标签: objective-c reactive-cocoa

多次阅读-flattenMap上的README后,我仍然无法弄清楚为什么这段代码没有按预期执行。我认为块内的代码会运行两次,但它根本没有被击中。我错过了一些真的很傻的东西吗? (我正在使用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];
}];

1 个答案:

答案 0 :(得分:2)

两件事:

订单确实很重要,因为这是一个主题,所以将其更改为:

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 == { {1}}。