首页 > 解决方案 > 使用 RxSwift Observables 进行递归调用

问题描述

我正在尝试使用 RxSwift Observables 进行递归调用。

import RxSwift

func observeUntil(initialValue: Int) -> Observable<Int> {

    return Observable.deferred {
        .just(initialValue)
    }
    .do(onNext: {
        print("current item is", $0)
    })
        .flatMapLatest{ (item) -> Observable<Int> in
            if item < 5 {
                return Observable.just(item)
                    //                    .delay(.seconds(1), scheduler: MainScheduler.instance)
                    .flatMapLatest{observeUntil(initialValue: $0 + 1)}
            } else {
                return .just(item)
            }
    }
}
_ = observeUntil(initialValue: 0)
    .subscribe()

当我在上面的代码中注释延迟时,输出正确,如下所示

current item is 0
current item is 1
current item is 2
current item is 3
current item is 4
current item is 5
Program ended with exit code: 0

延迟代码仅输出

current item is 0
Program ended with exit code: 0

请帮助我了解添加延迟后会发生什么。

标签: iosswiftrx-swift

解决方案


答案与您执行此代码的环境有关。程序调用该observeUntil(initialValue:)函数,然后在该函数返回时立即存在。

没有delay函数在递归代码全部执行后返回。随着delay延迟开始时函数返回。

基本上,您的程序在不到一秒的时间内结束,因此只输出“0”。


推荐阅读