Objective c 这个简单的`-flattmap`反应性代码有什么问题?

Objective c 这个简单的`-flattmap`反应性代码有什么问题?,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,在多次阅读了-flattmap上的自述文件后,我仍然不明白为什么这段代码没有按预期执行。我应该认为块中的代码会运行两次,但根本不会被命中。我是不是错过了一些很愚蠢的事情?(我使用的是v2.4.7)我还尝试在调用了-flattmap之后发送值,以防这是订单。没有骰子 RACSubject *test = [[RACSubject alloc] init]; [test sendNext:@1]; [test sendNext:@2]; [test sendCompleted]; [test fla

在多次阅读了
-flattmap
上的自述文件后,我仍然不明白为什么这段代码没有按预期执行。我应该认为块中的代码会运行两次,但根本不会被命中。我是不是错过了一些很愚蠢的事情?(我使用的是v2.4.7)我还尝试在调用了
-flattmap
之后发送值,以防这是订单。没有骰子

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
s将根据需要触发

今后,避免将副作用(如日志记录)放在
subscribe*
do*
方法系列之外的任何地方
FlattMap
和其他组合符希望是纯的,所以如果您违反了这一点,您将看到像这样的意外行为


您可能知道这一点,并且正在测试
flattmap
,但是您的代码可以简化为
map
,在这里--
flattmap
+
return
=
map

Facepalm。是的,这很有道理,非常感谢。因此,为了确保我的术语正确无误,这种行为是热信号的反映,还是完全不同的概念?@eremzeit我认为这是正确的,但相反。您通过
flattmap
导出的信号是冷信号。除非有人订阅它,否则它不会做任何事情。当热信号和冷信号(或者应该)完全像这样纯净时,谈论热信号和冷信号是很奇怪的,不过——我认为更合适的例子是网络请求。如果创建表示GET请求的热信号,则无论是否有人订阅该请求,都会执行该请求。然而,冷获取信号将等待有人“请求”请求的结果以启动请求。