gpt4 book ai didi

objective-c - 如何在没有嵌套订阅的情况下订阅命令执行信号的完成?

转载 作者:太空狗 更新时间:2023-10-30 03:48:55 26 4
gpt4 key购买 nike

我尝试了以下但没有成功。使用 -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 并不是执行此操作的唯一方法,它只是恰好发送一个表示完成的值,但它可以是您认为对您的用例具有适当重要性的任何值。

关于objective-c - 如何在没有嵌套订阅的情况下订阅命令执行信号的完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com