在 ReactiveCocoa -flattenMap:/-then: 链中访问之前的值

Accessing previous values in a ReactiveCocoa -flattenMap:/-then: chain

假设我有一个使用 -flattenMap:-then: 的 ReactiveCocoa 信号链,像这样:

__weak typeof(self) weakSelf = self

[[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [weakSelf barSignal];
}] then:^RACSignal *{
    // create a signal using foo
}];

在我的例子中,barSignal 依赖于 fooSignal 完成(next-ing,严格来说,但 fooSignal 只做一次)没有错误, barSignalnext 值是荒谬的(+combineLatest: 并不适用)。即使它发送 next,它们也是依赖操作,而不是并行操作。

显然,我可以使用 __block 变量来访问 foo,但这在风格上感觉不正确且难以遵循(不是严格的向下链)。

我可以编写自定义运算符来实现此目的,但我认为这比 __block 变量的代码要多得多,而且很难使其通用。

是否有一种干净的方式来访问 foo

最好的方法似乎是使用 -concat:+return:

__weak typeof(self) weakSelf = self

[[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [[weakSelf barSignal] concat:[RACSignal return:foo]];
}] flattenMap:^RACStream *(Foo *foo) {
    // create a signal using foo
}];

你也可以使用-mapReplace::

_weak typeof(self) weakSelf = self

[[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [[weakSelf barSignal] mapReplace:foo];
}] flattenMap:^RACStream *(Foo *foo) {
    // create a signal using foo
}];

我会删除第二个 -flattenMap:,而是在 barSignal 的末尾添加一个 -then:foo 变量将在此处的范围内,它将等到 barSignal 完成后再被订阅。

__weak typeof(self) weakSelf = self

[[self fooSignal] flattenMap:^RACStream *(Foo *foo) {
    return [[weakSelf barSignal] then:^RACSignal * {
        // create a signal using foo
        return [RACSignal createSignal ...
    }];
}];