链接RACSignals和回滚

时间:2014-09-11 13:57:23

标签: ios objective-c afnetworking reactive-cocoa racsignal

我对ReactiveCocoa相对较新,并且想知道如何将一系列REST GET调用链接在一起,以便它们按顺序执行。如果其中一个调用错误,那么整个过程将回滚。

所以我使用了pod' AFNetworking-RACExtensions',#0.1; 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
  }];    

如何使用NSArray信号同时仍然可以使用subscribeError和已完成的块来完成所有这些操作?

我假设它是这样的:

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

1 个答案:

答案 0 :(得分:3)

首先,我们通过- signalWithScheduler:将RACSequence转换为流媒体流。然后,我们可以通过- flatten合并流信息流转换为信号新流。之后,我们可以将其用作普通流。

是的,如果您不需要处理每个回复,当然可以使用- subscribeError: completed:

[[[[array rac_sequence] signalWithScheduler:[RACScheduler immediateScheduler]] flatten] subscribeNext:^(id x) {
    // Handle each results
} error:^(NSError *error) {
    // Handle error
} completed:^{
    // Completed
}];