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];
}];
}];
}