2

整数値を含む信号 A があります。-1 の値は無効な結果を示すため、値として -1 を渡す代わりに、エラーを送信したいと思います。このようにして、B にサブスクライブするものはすべて、subscribeNext: を介して有効な整数を受け取り、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;
    }
}
4

1 に答える 1

4

これを行う主な方法は-flattenMap:、上記の方法と同様に、を使用することです-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];
    }
}];

アップデート

または、newer-try:演算子を使用します。

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

    return YES;
}];
于 2013-08-01T04:21:46.730 に答える