gpt4 book ai didi

ios - RACCommand单独处理成功完成

转载 作者:行者123 更新时间:2023-11-29 01:51:03 24 4
gpt4 key购买 nike

我在实现一些简单的逻辑代码时遇到了问题。简单来说,我想做这样的事情:

Complete command() {
if (error) {
show error alert
}
else {
show "Happy ending" allert
}
}

我知道如何制作第一部分,但第二部分我有问题

我的尝试:

[self.vm.applyCommand.errors subscribeNext:^(id x) {
//Show alert with error
}];

[[[self.vm.applyCommand.executionSignals
map:^(RACSignal *signal) {
return [[signal ignoreValues] materialize];
}]
concat]
subscribeNext:^(RACEvent *event) {
//Show alert with "Happy end"
}];

在这种情况下,一切都按预期工作,直到出现错误。如果出现错误,我会看到两个警报(一个有错误,另一个有“Happy end”),但只想要一个有错误。

我知道为什么会这样

Errors will be automatically caught upon the inner signals ...etc

但我想要一些解决方案来实现理想的行为。

UPD:“...查看两个警报(一个有错误,另一个带有“Happy end”)”

最佳答案

有两种可能的方法可以实现您想要的效果,具体取决于 applyCommand 的执行信号的行为方式。

如果它只发送一个 next 值,然后立即完成,您可以简单地使用 switchToLatest 运算符来订阅该 next 值并显示带有“Happy end”的警报:

  [[self.command.executionSignals switchToLatest] subscribeNext:^(id x) {
//Show alert with "Happy end"
}];

否则情况会复杂得多,因为很难区分 RACCommand 执行信号的成功完成和失败。如果出现错误,您会在调用 [[signalignoreValues] Materialize]; 时收到“已完成”RACEvent,然后命令的 errors 信号发送错误作为其下一个值。

我设法使用命令的executing信号来做到这一点,该信号在errors信号发送后发送@NO错误。您可以使用 mergecombinePreviousWithStart:reduce 运算符来检查命令是否因发生错误而停止执行:

RACSignal *stoppedExecuting = [[self.vm.applyCommand.executing ignore:@YES] skip:1];
RACSignal *merged = [stoppedExecuting merge:self.vm.applyCommand.errors];

[[[merged combinePreviousWithStart:nil reduce:^id(id previous, id current) {
return @( [previous isKindOfClass:[NSError class]] || [current isKindOfClass:[NSError class]] );
}] filter:^BOOL(NSNumber *errorOccurred) {
return !errorOccurred.boolValue;
}] subscribeNext:^(id x) {
NSLog(@"Happy end!");
}];

这不是一个完美的解决方案,因为它取决于从各种 RACCommand 信号发送值的顺序,这是一个实现细节,将来可能会发生变化(它对我来说适用于 RAC 2.5) .我想这个问题可以通过 RAC 3.0 来解决,因为它 replaces RACCommand with Action , 但我还没有尝试过。

关于ios - RACCommand单独处理成功完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31413819/

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