Pau*_*ung 5 objective-c frp reactive-cocoa
我尝试了以下但没有成功.等效使用-subscribeNext:按预期工作.
// A
[[_viewModel.loginCommand.executionSignals flatten] subscribeCompleted:^{
NSLog(@"A");
}];
Run Code Online (Sandbox Code Playgroud)
我唯一的工作实现如下:
// B
[_viewModel.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) {
[loginSignal subscribeCompleted:^{
NSLog(@"B");
}];
}];
Run Code Online (Sandbox Code Playgroud)
为什么不能-flatten在"A"中工作,如何重写"B"以不使用嵌套订阅?
Dav*_*Lee 10
的-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);
}];
Run Code Online (Sandbox Code Playgroud)
请注意,我使用-concat而不是-flatten,因为它匹配RACCommand默认串行执行的语义.在这种情况下,它们最终会做同样的事情,因为命令只能一次执行一个信号-flatten,-concat所以会退化.
使用-materialize不是执行此操作的唯一方法,它恰好发送一个表示完成的值,但这可能是您发现对您的用例具有适当重要性的任何值.
| 归档时间: |
|
| 查看次数: |
2165 次 |
| 最近记录: |