我想對一批事件進行去抖動并在大約 1.5 秒的延遲后處理它們。這就是我所做的。
class ViewModel: ObservableObject {
@Published var pending: [TaskInfo]
private var cancellable: AnyCancellable? = nil
init() {
processPendingTasks()
}
func queueTask(task: TaskInfo) {
pending.append(task)
}
private func processPendingTasks() {
cancellable = $pendingTasks
.debounce(for: 1.5, scheduler: RunLoop.main)
.sink(receiveValue: { batch in
// Iterate though elements and process events.
})
}
}
問題:這很好用,但我遇到的問題是它執行了不必要的視圖更新,因為陣列被標記為@Published。
我在尋找什么:理想的方法是流式設定,我可以在其中獲取所有事件(以批處理方式),但sink應該在添加最后一個事件后等待 1.5 秒。
我試過PassthroughSubject,但它似乎只能讓我知道過去 1.5 秒內發生的最后一個事件。
uj5u.com熱心網友回復:
一種可能的解決方案是 aPassthroughSubject和collect運算子的組合。在queueTask將任務發送給主題。
func queueTask(task: TaskInfo) {
subject.send(task)
}
收到最后一條發送后 1.5 秒
subject.send(completion: .finished)
并訂閱
subject
.collect()
.sink { [weak self] tasks in
self?.pending = tasks
}
如果傳入任務的間隔小于 1.5 秒,您還可以使用.timeout(1.5)在超時間隔后終止管道的運算子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393988.html
