gpt4 book ai didi

objective-c - Reactive Cocoa - 将某些信号值转换为错误或完成

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

也许我仍在响应式(Reactive)学习曲线上苦苦挣扎,但我很难弄清楚如何将非响应式(Reactive)类与我的其余响应式(Reactive)代码联系起来。我正在使用一个类别来扩展非 react 类。

该属性只是一个枚举,表示网络操作的当前状态,如新建、已提交、正在处理和已完成等状态。现在我在我的类别中编写了以下方法:

@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return RACAble(self, state);
}
@end

但是,当状态从 Processing -> Completed 或任何状态转换为 Errored 时,我希望此信号发送 Completed 或 Error 而不是 Next Value。我怎样才能在一个类别中做到这一点?我想做类似的事情:

@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return [RACAble(self, state) map:^(NSNumber *state){
if ([state intValue] == iRequestStateComplete)
{
# SEND COMPLETE
}
else if ([state intValue] == iRequestStateErrored)
{
# SEND ERROR
}
else
{
return state;
}
}];
}
@end

编辑:我看了一下 GHAPIDemo 并提出了以下内容:

- (RACSignal*) rac_RequestSignal
{
RACSubject *subject = [[RACReplaySubject alloc] init];
[[RACAble(self, state) subscribeNext:^(NSNumber* s){
if ( [s intValue] == JRequestStateCompleted)
{
[subject sendNext:self];
[subject sendCompleted];
}
else if ([s intValue] == JRequestStateErrored)
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// .. Set up dict with necessary values.
NSError *error = [NSError errorWithDomain:@"blah" code:1 userInfo:dict];

[subject sendError:error];
}
}];
return subject;
}

我不是 100% 确定这是正确的方法,但它似乎有效。

最佳答案

每当您想要映射值 → 信号事件,而不是值 → 值,您应该使用 -flattenMap: 返回对应于每个输入值的信号。然后,正如名称中的“扁平化”所暗示的那样,它们将组合成一个结果信号。

但是,这种情况有点不同,因为您希望在获得 Complete 值后立即终止信号。我们将使用 -takeUntilBlock: 来表示该部分。

生成的代码看起来像这样:

- (RACSignal*) rac_RequestStateSignal
{
return [[RACObserve(self, state)
takeUntilBlock:^ BOOL (NSNumber *state){
return [state intValue] == iRequestStateComplete;
}]
flattenMap:^(NSNumber *state){
if ([state intValue] == iRequestStateErrored)
{
// Create a meaningful NSError here if you can.
return [RACSignal error:nil];
}
else
{
return [RACSignal return:state];
}
}];
}

(我使用 RACObserve 因为 ReactiveCocoa 2.0 现在是唯一受支持的版本,但您可以使用 RACAble 直到您准备好升级。)

作为一般规则,您应该 avoid using subjects when possible ,因为它们使代码更有状态并减少惰性。

关于objective-c - Reactive Cocoa - 将某些信号值转换为错误或完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788331/

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