我需要从api加载很多小文件,允许我一次只加载一个文件。由于它们非常小,我一次开始几次下载。根据结果,我开始下一批次装载。
对于每个请求,我使用了一个observable,然后将几个与combineLatest
组合在一起。在combineLatest
之后,我执行了flatMap
和concat
对同一功能的新调用。
作为抽象我这样做 - 伪代码,而不是编译:
func loadRecursively(items) -> Observable<XY> {
combineLatest(requestObservables)
.flatMap {
return loadRecursively(items-loadedItems)
}
}
一般来说这很有效。
问题:这导致递增的尾部增长,这似乎并没有被编译器优化所截断。因此,当加载一千个文件时,堆栈将会增长,最后应用程序将关闭。
我怎样才能避免长尾?或者一般来说如何使用rx解决这个问题?
答案 0 :(得分:0)
RxSwift
有concatMap
运算符(因为人们已经面对same problem),这允许您按顺序循环遍历Observable
。
简单示例:
Observable.from([1, 2, 3, 4])
.concatMap(Observable.just)
.subscribe(onNext: {
print($0)
})
.disposed(by: bag)
打印:
1
2
3
4