ios - 使用 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
请帮助我了解添加延迟后会发生什么。
解决方案
答案与您执行此代码的环境有关。程序调用该observeUntil(initialValue:)
函数,然后在该函数返回时立即存在。
没有delay
函数在递归代码全部执行后返回。随着delay
延迟开始时函数返回。
基本上,您的程序在不到一秒的时间内结束,因此只输出“0”。
推荐阅读
- java - 初始化时的 Firestore 内部错误
- ffmpeg - 使用ffmpeg将.avi转换为.webm时如何保持透明度
- javascript - 即使请求成功,Ajax 也会返回 404
- google-apps-script - 如何为Google表格上包含特定字符的每一行循环转置函数?
- python - 调试时使用控制台命令绘制图形
- php - 将产品图片(不是缩略图)添加到 WooCommerce 订单电子邮件
- java - Java8容器`for each`和Stream`for each`有什么区别
- jquery - 强制滚动到外部网站上的特定最高值
- vb.net - 使表单最大化,但不是全屏
- loops - (大 O)查找嵌套循环中的迭代次数