RACSignal и replayLazily. Как я могу справиться с ошибками?

Это работает блестяще...

@interface Hello : NSObject

@property (nonatomic, strong, readonly) RACSignal *signal;

@end

@interface Hello ()

@property (nonatomic, strong, readwrite) RACSignal *signal;

@end

@implementation Hello

- (instancetype)init
{
    self = [super init];
    if(self)
    {
        self.signal = [[[self createSignal] replayLazily];
    }
    return self;
}

- (RACSignal *)createSignal
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[Service getInstance] getProducts:^(NSArray *products) {
            [subscriber sendNext:products];
            [subscriber sendCompleted];
        } error:^(NSError *error) {
            [subscriber sendError:error];
        }];
    }];
}

@end

... пока нет ошибок.

Я предполагаю, что это потому, что sourceSignal для RACMulticastConnection отправил ошибку.

Поведение, которое я хочу иметь

  • запустить запрос, если первый подписчик
  • если подписывается второй подписчик - подключитесь к текущему запросу
  • если запрос выполнен успешно, новые подписчики получат результат от успешного запроса.
  • если запрос не был успешным, новые подписки вызовут новую выборку - многоадресная

1 ответ

Решение

Воссоздайте свой сигнал при возникновении ошибки

- (RACSignal *)createSignal
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[Service getInstance] getProducts:^(NSArray *products) {
            [subscriber sendNext:products];
            [subscriber sendCompleted];
        } error:^(NSError *error) {
            [subscriber sendError:error];
            self.signal = [[[self createSignal] replayLazily];
        }];
    }];
}
Другие вопросы по тегам