gpt4 book ai didi

swift - Rx swift : chaining several actions

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:33 24 4
gpt4 key购买 nike

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

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

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

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

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);
}

最佳答案

我们假设 makeAPIRequestadditionalProcessing返回 Observable<SomeNotVoidType> , 和 storeData接受一个数组作为它的参数并返回一个 Observable<Array> .这样,您可以执行以下操作:

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

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

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

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

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

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

然后你又想制作Observables对于每个数组元素,它们将代表额外的处理。请注意,您需要使用 flatMapflatMapLates ,否则你最终会得到像 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);

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

关于swift - Rx swift : chaining several actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com