来自数组的 RxSwift 可观察对象序列
Posted
技术标签:
【中文标题】来自数组的 RxSwift 可观察对象序列【英文标题】:RxSwift Sequence of observables from array 【发布时间】:2019-08-10 20:38:36 【问题描述】:在我的应用程序中,我必须从 Amazon S3 下载几个文件,为此我创建了一个函数,该函数可以下载单个文件并返回和观察。我还创建了第二个函数,我称之为 downloadAll。此函数的目的是按顺序下载每个 S3 文件。
由于某些文件很大并且文件很多(超过 50 个),如果我只是合并所有可观察的数据,我最终会因为并发性而从亚马逊收到很多超时。
我尝试过的:
并发合并
let observables = self.syncItem!.files.map (f) in
return Observable.of(f)
let o = Observable.from(observables).merge(maxConcurrent: 2)
结果:我下载了前两个文件,但没有下载其他文件。
ConcatMap
return Observable.from(self.syncItem?.files).concatMap( (file) in
return self.downloadS3File(file: file)
)
结果:只下载了第一个文件
**DownloadS3FileFunction 被省略...对于单个文件下载工作正常,并在下载完成时发出一个 File 对象**
在问这个问题之前我已经搜索了很多。有人可以帮忙吗?
【问题讨论】:
【参考方案1】:如果在您使用concatMap
时只下载第一个文件,那么问题出在您的downloadS3File(file:)
函数中。当它完成下载文件时它不会发出完成事件,因此 concatMap 不会开始第二次下载。
这可能也是您的其他解决方案的问题。
【讨论】:
实际上我只是发出一个未完成的下一个事件......我将发出一个完整的事件并返回。感谢您的反馈意见 ! :D 是的,在 onNext 修复问题后设置 observable.onComplete() 就是问题...再次感谢以上是关于来自数组的 RxSwift 可观察对象序列的主要内容,如果未能解决你的问题,请参考以下文章
iOS RxSwift - 如何“断开”一个 observable?