是否有更好的方法来捕获错误和完成?

时间:2014-10-29 21:15:44

标签: reactive-cocoa

目前我创建了一个内部信号来调用[Watchtower reportToServerWithBeaconRegionArraySignal:],因为这样我只能传递next,并捕获完成和错误信号,我不想传播因为我想继续订阅来自[self rangedBeaconsSignal]的更多信号。

我确定必须有更好的方法,但我无法看到它:我已尝试使用catch:(并从提供的块中返回[RACSignal empty]那里),但这只会导致错误,而不是完成。

(p.s。我可以在这里检查我对[disposable dispose]的使用是否正确?可能它是多余的):

[[[self rangedBeaconsSignal] flattenMap:^RACStream * (CLBeaconRegion *region) {

        return [RACSignal createSignal:^RACDisposable * (id <RACSubscriber> subscriber) {
            RACDisposable *disposable= [RACDisposable new];
            [[Watchtower reportToServerWithBeaconRegionArraySignal:@[region] fromBackground:NO]
                subscribeNext:^(id x) {
                    [subscriber sendNext:x];
                } error:^(NSError *error) {
                    [disposable dispose];
                } completed:^{
                    [disposable dispose];
                }];
            return disposable;
        }];

    }] subscribeNext:^(id x) {
        NSLog(@"Sent beacon to server");
     } error:^(NSError *error) {
        // ideally errors might reach here, but I don't want to unsubscribe, so I'm ignoring them for now. 
     } completed:^{
    }];

1 个答案:

答案 0 :(得分:1)

我认为找到答案,这对我有用。基本上completed被捕获并被忽略,错误基于订阅者,然后使用catch:(返回空)捕获,然后将其包装在-repeat语句中,以便它不会不要放弃下一个范围的dBeacon。呜!

[[[[[self rangedBeaconsSignal]
        flattenMap:^RACStream * (CLBeaconRegion *region) {
            return [RACSignal createSignal:^RACDisposable * (id <RACSubscriber> subscriber) {
                RACDisposable *disposable = [RACDisposable new];

                [[Watchtower reportToServerWithBeaconRegionArraySignal:@[ region ] fromBackground:NO]
                    subscribeNext:^(id x) {
                        [subscriber sendNext:x];
                    } error:^(NSError *error) {
                        [subscriber sendError:error];
                    } completed:^{
                        [disposable dispose];
                    }
                ];

                return disposable;
            }];
        }]
        catch:^RACSignal * (NSError *error) {
            NSLog (@"Caught server error..");
            return [RACSignal empty];
        }]
        repeat] // means that it'll keep trying for the next ranged regions
        subscribeNext:^(id x) {
            NSLog(@"Sent beacon to server");
        }];