来自数组的 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?

RxSwift:结合不同类型的可观察对象和映射结果

swift RxSwift:基于ActivityIndi​​cator过滤可观察序列的元素。

RxSwift 可观察数组排序

RxSwift - 来自可观察到的忽略错误的驱动程序

在 RxSwift 中具有来自 Observable 的最后两个元素的运算符