RACSignal和重播拉齐利。我该如何处理错误?

时间:2014-10-10 13:49:20

标签: reactive-cocoa racsignal

这非常出色......

@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

......只要没有错误。

我想这是因为RACMulticastConnection的sourceSignal发送了一个错误。

我想要的行为

  • 如果是第一个订阅者
  • 则启动请求
  • 如果第二个订阅者订阅 - 挂钩正在进行的请求
  • 如果请求成功,任何新订阅者都将从成功请求中获得结果
  • 如果请求不成功,新订阅将触发新的提取 - 多播

1 个答案:

答案 0 :(得分: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];
        }];
    }];
}