加载大量物品时的尾递归

时间:2018-03-24 15:02:58

标签: swift observable rx-swift reactive

我需要从api加载很多小文件,允许我一次只加载一个文件。由于它们非常小,我一次开始几次下载。根据结果​​,我开始下一批次装载。

对于每个请求,我使用了一个observable,然后将几个与combineLatest组合在一起。在combineLatest之后,我执行了flatMapconcat对同一功能的新调用。

作为抽象我这样做 - 伪代码,而不是编译

func loadRecursively(items) -> Observable<XY> {
    combineLatest(requestObservables)
    .flatMap {
        return loadRecursively(items-loadedItems)
    }
}

一般来说这很有效。

问题:这导致递增的尾部增长,这似乎并没有被编译器优化所截断。因此,当加载一千个文件时,堆栈将会增长,最后应用程序将关闭。

我怎样才能避免长尾?或者一般来说如何使用rx解决这个问题?

1 个答案:

答案 0 :(得分:0)

RxSwiftconcatMap运算符(因为人们已经面对same problem),这允许您按顺序循环遍历Observable

简单示例:

Observable.from([1, 2, 3, 4])
    .concatMap(Observable.just)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: bag)

打印:

1
2
3
4