簡體   English   中英

如何在RxSwift中按順序循環觀察?

[英]How do I sequentially loop an observable in RxSwift?

我正在嘗試創建一個輪詢網絡服務的流。 此時它會查詢服務,然后在短暫延遲后完成。 我希望繼續流重啟而不是完成從而永遠輪詢服務。

你可以做點什么......

myPollingStream.repeat()

但是在RxSwift中repeat實際上是repeatElement ,因此實際上生成了一個可觀察的流。 您可以concatMap這些連接concatMap到扁平的序列序列,但RxSwift沒有concatMap運算符。

那么如何在RxSwift中循環一個observable呢?

我希望請求是順序的,而不是並發的,因此flatMap不是一個選項,因為它合並了導致重疊請求的流。 我正在尋找類似於retry()工作方式,但重新啟動onComplete而不是onError

Observable.repeatElement(myPollingStream, scheduler: MainScheduler.instance).concat()
  • repeatElement(_:scheduler:)將創建無限的輪詢查詢流。
  • 然后contat()將確保在訂閱下一個查詢之前完成每個輪詢查詢。

注意

雖然上述方法在理論上有效,但沒有背壓實現, repeatElements(_:scheduler:)會發出事件,直到最終耗盡內存。 這使得此解決方案不適用於RxSwift 3.0。 有關RxSwift存儲庫的更多詳細信息,請參閱此問題

選項1:遞歸函數

你的myPollingStream

func myPollingStream() -> Observable<Result> { 
    return Observable<String>.create { observer in
        // your network code here


        return Disposables.create()
    }
}

然后你創建一個遞歸函數:

func callMyPollingStream() {
    myPollingStream()
        .subscribe(onNext: { result in
            callMyPollingStream() // when onNext or onCompleted, call it again 
        })
        .addDisposableTo(db)
}

選項2:使用間隔

let _ = Observable<Int>
            .interval(5, scheduler: MainScheduler.instance)
            .subscribe(onNext: { _ in
                let _ = myPollingStream().subscribe()
            })
            .addDisposableTo(db)

使用此選項,myPollingStream()函數將每5秒調用一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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