如果我有一個組合管道,它將更改列印到一個陣列,那么是否可以在不運行管道的情況下更新該陣列?
class ObserveableTest: ObservableObject {
private var cancellables: Set<AnyCancellable> = []
@Published var items: [Int] = []
init() {
$items
.debounce(for: 0.6, scheduler: RunLoop.main)
.sink {
print($0)
}
.store(in: &cancellables)
}
func pleaseDoNotNotifyPipeline() {
items.append(1)
}
}
更新: 提供的代碼是我作業的簡化版本。簡而言之,我在一個購物籃管理器上作業,每當用戶更改產品數量(或以其他方式更改購物籃)時,都需要將請求發送到后端,為什么會發生去抖動。在上面的代碼中,它只是簡單地顯示了對陣列的更改。
情況是,用戶對籃子所做的更改應該運行管道,但是,也可能是系統(來自網路回應等)更新本地籃子本身,在這種情況下,管道應該不跑。
我擔心在極少數情況下取消和重新訂閱管道可能意味著用戶的更改丟失。但我也可能意識到取消/重新訂閱是唯一的解決方案,我需要處理這種罕見的情況。或者現在我已經詳細闡述了您是否看到其他解決方案?
uj5u.com熱心網友回復:
我不知道pauseCombine中有什么功能。您指向訂閱的指標是回傳的AnyCancellable.
您添加了一個debounce. 我很好奇您是否想忽略第一個值(在您的情況下為空陣列)。為此,您可以.dropFirst()在管道中使用。
否則,我認為您必須在 mutating 之前取消并重新訂閱items。
class Test: ObservableObject {
private var cancellable: AnyCancellable?
@Published var items: [Int] = []
init() {
observe()
}
func pleaseDoNotNotifyPipeline() {
cancel()
items.append(1)
observe()
}
func cancel() {
cancellable?.cancel()
}
func observe() {
cancellable = $items
.dropFirst() // ignores the first value []
.sink {
print($0)
}
}
}
uj5u.com熱心網友回復:
經過進一步檢查,我得到了答案。這就是 class 的情況PassthroughSubject。
class ObserveableTest: ObservableObject {
private var cancellables: Set<AnyCancellable> = []
/// private(set) to restrict all changes to go through class functions
@Published private(set) var items: [Int] = []
/// A subject we can pass data into, when we wanna publish changes
private let listener = PassthroughSubject<[Int], Never>()
init() {
listener
.debounce(for: 0.6, scheduler: RunLoop.main)
.sink {
print($0)
}
.store(in: &cancellables)
}
func thisFunctionIsCalledByUserAndTriggersPipeline() {
items.append((0...1000000).randomElement()!)
listener.send(items) // publish to pipeline
}
func thisFunctionIsCalledByServerAndDoesNotTriggerPipeline() {
items.append((0...1000000).randomElement()!)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313633.html
上一篇:請求中缺少查詢引數
