Ios 如何在信号链中发送错误

Ios 如何在信号链中发送错误,ios,objective-c,cocoa,frp,reactive-cocoa,Ios,Objective C,Cocoa,Frp,Reactive Cocoa,我有一个包含整数值的信号a。值-1表示结果无效,因此我希望发送一个错误,而不是将-1作为值传递。这样,订阅B的任何内容都将通过SubscribeText:接收有效整数,并通过subscribeError:接收错误 我想我知道如何使用RACSubject: RACSequence *A = [@[ @(2), @(6), @(5), @(-1), @(4) ] rac_sequence]; RACSubject *B = [RACSubject subject]; [A subscribeNext

我有一个包含整数值的信号a。值-1表示结果无效,因此我希望发送一个错误,而不是将-1作为值传递。这样,订阅B的任何内容都将通过SubscribeText:接收有效整数,并通过subscribeError:接收错误

我想我知道如何使用RACSubject:

RACSequence *A = [@[ @(2), @(6), @(5), @(-1), @(4) ] rac_sequence];
RACSubject *B = [RACSubject subject];
[A subscribeNext:^(NSNumber *val) {
    if ( [val integerValue] == -1 ) {
        [B sendError:[NSError errorWithDomain:@"MyDomain" code:0 userInfo:nil]];
    } else {
        [B sendNext:val];
    }
} error:^(NSError *error) {
    [B sendError:error];
} completed:^{
    [B sendCompleted];
}];
我想知道是否有一种更“内联”的方法可以做到这一点:

RACSequence *A = [@[ @(2), @(6), @(5), @(-1), @(4) ] rac_sequence];
RACSignal *B = [A filter:^BOOL(id val) {
    if ( [val integerValue] == -1 ) {
        //FIXME: send an error to B's subscriber(s)
        return NO;
    } else {
        return YES;
    }
}

执行此操作的主要方法是使用
-flattmap:
,类似于上面编写的
-filter:
。以您的例子:

RACSignal *B = [A flattenMap:^(NSNumber *number) {
    if (number.intValue == -1) {
        return [RACSignal error:[NSError errorWithDomain:@"MyDomain" code:0 userInfo:nil]];
    } else {
        return [RACSignal return:number];
    }
}];
使现代化 或者,使用较新的运算符:

RACSignal *B = [A try:^(NSNumber *number, NSError **error) {
    if (number.intValue == -1) {
        *error = [NSError errorWithDomain:@"MyDomain" code:0 userInfo:nil];
        return NO;
    }

    return YES;
}];

执行此操作的主要方法是使用
-flattmap:
,类似于上面编写的
-filter:
。以您的例子:

RACSignal *B = [A flattenMap:^(NSNumber *number) {
    if (number.intValue == -1) {
        return [RACSignal error:[NSError errorWithDomain:@"MyDomain" code:0 userInfo:nil]];
    } else {
        return [RACSignal return:number];
    }
}];
使现代化 或者,使用较新的运算符:

RACSignal *B = [A try:^(NSNumber *number, NSError **error) {
    if (number.intValue == -1) {
        *error = [NSError errorWithDomain:@"MyDomain" code:0 userInfo:nil];
        return NO;
    }

    return YES;
}];

这应该在文档中的某个地方,花了一个小时四处搜索以获取此示例:)后来添加了两个相关运算符,请查看和。这应该在文档中的某个地方,花了一个小时四处搜索以获取此示例:)后来添加了两个相关运算符,请查看和。