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