0

私は ReactiveCocoa に比較的慣れていないので、一連の REST GET 呼び出しを連鎖させて順番に実行する方法を知りたいと思っていました。呼び出しの 1 つがエラーになると、プロセス全体がロールバックされます。

だから私はポッド「AFNetworking-RACExtensions」、「0.1.1」を使用しています。信号のNSArrayがあります。これらの信号のほとんどは次のようになります。

 - (RACSignal *) form
{
@weakify(self);

RACSubject *repSubject = [RACSubject subject];
[[ServiceClient getForm] subscribeNext:^(RACTuple *jsonTuple) {
    if ([jsonTuple second])
    {
        // create core data objects here            
        [repSubject sendNext: nil];
        [repSubject sendCompleted];
    }
} error:^(NSError *error) {
    [repSubject sendError: error];
}];
return repSubject;     
}

したがって、このようなシグナルの負荷は NSArray にあります。これらの呼び出しを、配列に次々と表示される順序で処理し、エラー ハンドラーと完了ブロックを共有したいと考えています。nsarray を使用せずに成功したと思います。次のようなコードがありました。

@weakify(self);
[[[[[[self form] flattenMap:^(id value) {
    // perform your custom business logic
    @strongify(self);
   return [self signal2];
}] flattenMap:^(id value) {
    // perform your custom business logic
    @strongify(self);
    return [self signal3];
}] flattenMap:^(id value) {
    // perform your custom business logic
    @strongify(self);
    return [self signal4];
}] flattenMap:^(id value) {
    // perform your custom business logic
    @strongify(self);
    return [self signal5];
}] subscribeError:^(NSError *error) {
      @strongify(self);
      [self handleError: error];
  } completed:^{
      // Successful Full Sync
      // post notification
  }];    

subscribeError と complete ブロックを使用しながら、シグナルの NSArray を使用してこれらすべてを行うにはどうすればよいですか?

私はそれが次のようなものだと仮定しています:

 @weakify(self);
 [[[array.rac_sequence flattenMap:^RACStream *(id value) {
     // dunno what to do
 }] subscribeError:^(NSError *error) {
      @strongify(self);
      [self handleError: error];
  } completed:^{
      // Successful Full Sync
      // post notification
  }];
4

1 に答える 1

3

まず、RACSequence を によって stream-of-streams に変換します- signalWithScheduler:。次に、ストリームのストリームを、 を介して新しいストリームのシグナルにマージ- flattenできます。その後、通常のストリームとして使用できます。

はい、各応答を処理する必要がない場合は- subscribeError: completed:、もちろん使用できます。

[[[[array rac_sequence] signalWithScheduler:[RACScheduler immediateScheduler]] flatten] subscribeNext:^(id x) {
    // Handle each results
} error:^(NSError *error) {
    // Handle error
} completed:^{
    // Completed
}];
于 2014-09-11T14:31:30.890 に答える