在 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
只做一次)没有错误, barSignal
的 next
值是荒谬的(+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 ...
}];
}];
假设我有一个使用 -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
只做一次)没有错误, barSignal
的 next
值是荒谬的(+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 ...
}];
}];