我尝试了以下方法,但均未成功。等效的使用-subscribeNext:
效果符合预期。
// A
[[_viewModel.loginCommand.executionSignals flatten] subscribeCompleted:^{
NSLog(@"A");
}];
我唯一可行的实现如下:
// B
[_viewModel.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) {
[loginSignal subscribeCompleted:^{
NSLog(@"B");
}];
}];
为什么-flatten
在“ A”中不起作用,以及如何重写“ B”以不使用嵌套订阅?
的-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
由于命令一次只执行一个信号。
使用-materialize
不是做到这一点的唯一方法,它恰好会发送一个表示完成的值,但这可能是您认为对用例有意义的任何值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句