我尝试了以下操作但没有成功。等效使用-subscribeNext:
按预期工作。
// A
[[_viewModel.loginCommand.executionSignals flatten] subscribeCompleted:^{
NSLog(@"A");
}];
我唯一的工作实现如下:
// B
[_viewModel.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) {
[loginSignal subscribeCompleted:^{
NSLog(@"B");
}];
}];
为什么不-flatten
在“A”中工作,如何重写“B”以不使用嵌套订阅?
The -flatten
运算符返回一个仅当所有内部信号都完成时才完成的信号,这需要外部信号也完成。同样的道理-concat
。因此,一旦应用任一运算符,生成的信号就无法表示单独的完成情况,而只能表示最终的聚合完成情况。
除了嵌套订阅之外,您还可以转换内部信号,以便它们发送一个表示完成的值。这样做的一种方法是-materialize
:
[[[_viewModel.loginCommand.executionSignals
map:^(RACSignal *loginSignal) {
// Using -ignoreValues ensures only the completion event is sent.
return [[loginSignal ignoreValues] materialize];
}]
concat]
subscribeNext:^(RACEvent *event) {
NSLog(@"Completed: %@", event);
}];
请注意,我使用了-concat
代替-flatten
,因为它符合语义RACCommand
的默认串行执行。他们最终在这种情况下做了同样的事情,-flatten
退化为行为-concat
因为该命令一次只执行一个信号。
Using -materialize
不是执行此操作的唯一方法,它只是碰巧发送一个表示完成的值,但这可以是您认为对您的用例适当重要的任何值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)