我目前有類似的代碼......
var isFetching = false
func fetch() {
guard !isFetching else { return }
fetching = true
apiPublisher
.receive(on: .main)
.handleEvents(receiveCompletion: { [weak self] _ in
self?.fetching = false
})
.assign(to: \.foo, on: self)
.store(in: &cancellables)
}
但我對阻止多個請求發生的方式并不滿意。它有效,但感覺笨重。
我覺得應該有一種更“組合”的方式來做到這一點。
有沒有更優雅/組合的方式來做到這一點?
uj5u.com熱心網友回復:
這里的問題是,您在一個函式 ( fetch()) 中擁有整個發布者訂閱鏈,該函式幾乎可以在任何時間從任何執行緒由幾乎任何其他代碼呼叫。為了在“更多組合-y”中做到這一點,您需要限制它。所以問題是什么呼叫了這個fetch()函式?如果您將所有這些呼叫站點都包裝在一個 Publisher 中,然后設定 atrigger.flatMap { apiPublisher }并設定flatMap忽略事件,同時等待當前網路請求完成。
像這樣的東西:
trigger
.flatMap(maxPublishers: .max(1)) {
apiPublisher
}
.receive(on: .main)
.assign(to: \.foo, on: self)
.store(in: &cancellables)
這里要注意的重要一點是,你只執行一次這段代碼(如果這是一個視圖控制器,可能在 viewDidLoad 中。然后當你想要發出請求時,你通過trigger發布者發送一個事件。這flatMap將確保只有一個 apiPublisher訂閱將一次發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349770.html
