objective-c - 这个简单的 `-flattenMap` ReactiveCocoa 代码有什么问题?

标签 objective-c reactive-cocoa

多次阅读 -flattenMap 上的自述文件后,我仍然无法弄清楚为什么这段代码没有按预期执行。我应该认为 block 内的代码会运行两次,但它根本没有受到影响。我错过了一些非常愚蠢的事情吗? (我使用的是 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* 系列方法的 block 之外的任何地方放置副作用(例如日志记录)。 flattenMap 和其他组合器希望是纯粹的,因此如果违反这一点,您会看到类似这样的意外行为。

您可能知道这一点,并且只是测试 flattenMap,但您的代码可以简化为此处的 map -- flattenMap + 返回 == map

关于objective-c - 这个简单的 `-flattenMap` ReactiveCocoa 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29840612/

相关文章:

iphone - iStat for iPhone如何获取WiFi MAC和任务列表

objective-c - Objective-C 中的函数

objective-c - 使用 ReactiveCocoa 枚举对象之间有延迟的数组

ios - RxSwift——MainScheduler.instance 与 MainScheduler.asyncInstance

objective-c - 如何绑定(bind)两个 RACChannelTerminals?

ios - 图案图像如何实现视差效果?

iphone - 我们需要释放常量吗?

ios - UIstoryboard:Modal segues 的 Animates 选项在 6.0 之前的 iOS 版本上不可用

ios - CocoaAction 不触发 Action

swift2 - 类型 'Error' 约束为非协议(protocol)类型,即使类型是协议(protocol)