首页 > 解决方案 > 在不运行组合管道的情况下更新属性

问题描述

如果我有一个组合管道,可以打印对数组的更改,那么是否可以在不运行管道的情况下更新该数组?

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)
    }
}

更新: 提供的代码是我工作的简化版本。简而言之,我在篮子管理器上工作,每当用户更改产品的数量(或以另一种方式更改篮子)时,都需要向后端发送请求,为什么会出现去抖动。在上面的代码中,它只是简单地显示了对数组的更改。

情况是,用户对购物篮所做的更改应该运行管道,但是,也可能是系统(来自网络响应等)更新本地购物篮本身,在这种情况下管道应该不跑。

我担心在极少数情况下取消和重新订阅管道可能意味着用户的更改会丢失。但我也可能意识到取消/重新订阅是唯一的解决方案,我需要处理这种罕见的情况。或者你现在看到我已经详细阐述的其他解决方案了吗?

标签: swiftcombine

解决方案


我不知道pause合并中的功能。您指向订阅的指针是返回的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)
            }
    }
}

推荐阅读