[英]Recursive calls using 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()
當我評論上述代碼中的延遲時,output 如下所示正確
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:)
function ,然后在 function 返回時立即存在。
delay
在遞歸代碼全部執行后立即返回。 隨着delay
,function 在延遲開始時返回。
基本上,您的程序在不到一秒的時間內結束,因此只有“0”是 output。
_ = observeUntil(initialValue: 0).subscribe()
如果引用沒有被保存,則返回一個 Disposable,這個 observable 將在第一次 onNext 之后被銷毀。
嘗試:
let disposable = observeUntil(initialValue: 0).subscribe()
為避免 memory 泄漏,請務必在完成后將其丟棄。
DispatchQueue.main.asyncAfter(.now() + 6) { // after 6 seconds
disposable.dispose()
}
為了澄清 Daniel T. 的答案,只要您的代碼
_ = observeUntil(initialValue: 0)
.subscribe()
從 scope 出來,訂閱被處理掉了,這就是為什么你看到它沒有延遲,但是添加延遲最終會導致序列的 rest 直到它被處理掉之后才執行。 訂閱 observable 的 class 應該有一個DisposeBag
,當它退出 scope 時,它將保留訂閱。
// As an instance variable in your class, or some other place you want to retain the subscription
let disposeBag = DisposeBag()
// Where you subscribe
observeUntil(initialValue: 0)
.subscribe()
.disposed(by: myClass.disposeBag)
當處理包用完 scope 時,您的訂閱也將被處理掉,從而終止發出的序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.