簡體   English   中英

使用 RxSwift Observables 進行遞歸調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM