Есть ли лучший способ поймать как ошибки, так и завершения?

В настоящее время я создаю внутренний сигнал для вызова [Watchtower reportToServerWithBeaconRegionArraySignal:], потому что таким образом я могу передавать только next и перехватывать сигналы завершения и ошибки, которые я не хочу распространять, потому что я хочу подписаться на дальнейшие сигналы от [self rangedBeaconsSignal].

Я уверен, что должен быть лучший способ, но я его не вижу: я пытался использовать catch: (и возвращать [RACSignal empty] из предоставленного там блока), но это только отлавливает ошибки, а не завершения.

(ps могу ли я просто проверить правильность использования [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:^{
    }];

person Ian Dundas    schedule 29.10.2014    source источник


Ответы (1)


Нашел ответ, я думаю, это работает для меня. По сути, completed перехватывается и игнорируется, ошибка основывается на подписчике, а затем перехватывается с использованием catch: (возвращается пустым), а затем оборачивается в оператор -repeat, чтобы он не сдавался для следующего rangedBeacon. ву!

[[[[[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");
        }];
person Ian Dundas    schedule 29.10.2014