>通过单独的调用将对象发送到后端
>在步骤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); }
解决方法
这样,您可以执行以下操作:
首先,创建一个Observable数组,表示将单个对象发送到后端.然后使用toObservable方法,以便稍后可以转换结果信号:
让apiOperations = data.map {makeAPIRequest($0)} .toObservable()
然后使用合并运算符,它将生成一个Observable,只有在所有API调用完成时才会完成.您还可以使用toArray运算符,它将API调用结果放入一个数组中:
let resultsArray = apiOperations.merge().toArray()
这将为您提供一个Observable< Array< ApiResult>>,当所有API操作成功完成时,它将发送一个Next事件.现在您可以将结果存储在数据库中:
let storedResults = resultsArray.flatMap { storeDatabase($0) }
然后你想再为每个数组元素创建Observable,这样它们就代表了额外的处理.请注意,您需要使用flatMap和flatMapLates,否则最终会得到嵌套的observable,如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);
请注意,您不需要所有中间变量,我只是让它们描述所有步骤.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。