4

假设我们有一个 AnObject 实例数组,并且需要执行以下操作序列:

  • 通过单独的调用将对象发送到后端
  • 步骤 1 完成后将此数组批量存储到 DB
  • 第 2 步完成后,对每个项目进行额外处理

并且我们希望仅在执行所有这些步骤(或出现错误)之后接收信号。通过RxSwift实现这一目标的正确方法是什么,实际上是否可能?

请在下面找到我的原型函数。不幸的是,我没有想出一个有效的链接代码示例,所以没有什么可以演示的。

func makeAPIRequest(object: AnObject) -> Observable<Void> {
    ...
}

func storeData(data: [AnObject]) -> Observable<Void> {
    ...
}

func additionalProcessing(object: AnObject) -> Observable<Void> { 
    ...
} 

func submitData()
{
   let data: [AnObject] = ...;

   let apiOperations = data.map{ makeAPIRequest($0) };
   let storageOperation = storeData(data);
   let processingOperations = data.map{ additionalProcessing($0) };

   ... // some code to chain steps 1-3
   .subscribe { (event) -> Void in
       // should be called when operations from step 3 finished  
   }.addDisposableTo(disposeBag);
}
4

1 回答 1

9

让我们假设两者都makeAPIRequest返回additionalProcessing一个Observable<SomeNotVoidType>,并且storeData将一个数组作为其参数并返回一个Observable<Array>。这样,您可以执行以下操作:

Observables首先,创建一个表示将单个对象发送到后端的数组。然后使用toObservable方法,因此可以稍后转换结果信号:

let apiOperations = data.map{ makeAPIRequest($0) }.toObservable()

然后使用merge将生成 , 的运算符Observable仅在所有 API 调用完成时完成。您还可以使用toArray运算符,它将 API 调用结果放入一个数组中:

let resultsArray = apiOperations.merge().toArray()

这将为您提供一个,当所有 API 操作成功完成时Observable<Array<ApiResult>>,它将发送一个事件。Next现在您可以将结果存储在数据库中:

let storedResults = resultsArray.flatMap { storeDatabase($0) }

然后你又想Observables为每个数组元素制作,所以它们将代表额外的处理。请注意,您需要使用flatMapand flatMapLates,否则您最终会得到嵌套的可观察对象,例如Observable<Observable<SomeType>>.

let additionalProcessingResults = storedResults.flatMap {
      return $0.map(additionalProcessing).toObservable()
    }.flatMapLatest { return $0 }

然后,您可以订阅附加处理的成功完成(或者您可以对其单独的结果执行某些操作):

additionalProcessingResults.subscribe { (event) -> Void in
       // should be called when operations from step 3 finished  
   }.addDisposableTo(disposeBag);

请注意,您不需要所有中间变量,我只是让它们来描述所有步骤。

于 2016-02-11T17:58:55.873 回答