1

これは見事に機能します...

@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 がエラーを送信したためだと思います。

私がしたい行動

  • 最初のサブスクライバーの場合はリクエストを開始します
  • 2 番目のサブスクライバーがサブスクライブした場合 – 進行中のリクエストにフックする
  • リクエストが成功した場合、新しいサブスクライバーは成功したリクエストから結果を取得します
  • リクエストが成功しない場合、新しいサブスクリプションが新しいフェッチをトリガーします – マルチキャスト
4

1 に答える 1

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];
        }];
    }];
}
于 2014-10-10T14:13:51.353 に答える