首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应Cocoa -将某些信号值转换为错误或已完成

反应Cocoa -将某些信号值转换为错误或已完成
EN

Stack Overflow用户
提问于 2013-09-13 14:03:21
回答 1查看 3K关注 0票数 8

也许我仍然在反应学习曲线上挣扎,但我很难弄清楚如何将非反应性类与我的其他反应性代码连接起来。我使用一个类别来扩展非反应性类。

该属性只是一个Enum,表示网络操作的当前状态,如New、Submitted、Processing和Completed。现在,我已经在我的类别中编写了以下方法:

代码语言:javascript
复制
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
    return  RACAble(self, state);
}
@end

但是,当状态从处理->完成或从任何状态转换到Errored时,我希望这个信号发送已完成或错误,而不是下一个值。我怎样才能在一个类别中做到这一点呢?我想做这样的事情:

代码语言:javascript
复制
@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并提出了以下内容:

代码语言:javascript
复制
- (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;
}

我不是百分之百肯定这是正确的方式,但它似乎是有效的。

EN

回答 1

Stack Overflow用户

发布于 2013-09-13 17:53:44

无论何时要映射值-flattenMap:信号事件,而不是值→值,都应该使用→返回与每个输入值对应的信号。然后,正如名字中的“扁平”所暗示的,它们将被组合成一个产生的信号。

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

生成的代码如下所示:

代码语言:javascript
复制
- (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是因为https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/CHANGELOG.md#20现在是唯一受支持的版本,但是您可以使用RACAble,直到准备好升级为止。)

通常情况下,您应该使用avoid using subjects when possible,因为它们使代码更有状态并减少了懒惰。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18788331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档