合并:在 sink() 调用中重置观察到的布尔值?

Combine: resetting observed boolean within sink() call?

我有以下代码:

    $myBoolean
        .debounce(for: 2, scheduler: RunLoop.main)
        .removeDuplicates()
        .sink { newValue in
            self.myBoolean = false
            ....... 
            ...... (closure called every 2 seconds if I don't use `removeDuplicates()`)
        }
        .store(in: &subscribers)

我在可观察对象的@Published 变量上使用 sink()。应用程序的不同部分可以将该布尔值设置为 true。发生这种情况时,我希望 sink() 中的代码变为 运行。

发生这种情况时,我希望代码将 myBoolean 重置为 false。因此,只有当我知道 sink() 代码 运行s 时,我才希望将布尔值设置回 false。

如何仅当 sink() 代码 运行 时才将 myBoolean 设置回 false 而不会无休止地调用 sink()?

myBoolean 声明如下:

@Published fileprivate var myBoolean:Bool = false

使用自定义类型 MyBoolfilter 运算符,您可以获得类似的行为。


import Combine

class Abc: ObservableObject {
    struct MyBool: Equatable {
        let value: Bool
        let isFromSinkCall: Bool
    }
    
    @Published var myBoolean: MyBool = .init(value: true, isFromSinkCall: false)
    
    private var subscribers = Set<AnyCancellable>()
    
    init() {
        setup()
    }
    
    func setup() {
        $myBoolean
            .debounce(for: 2, scheduler: RunLoop.main)
            .removeDuplicates()
            .filter({ ![=10=].isFromSinkCall })
            .sink { newValue in
                self.myBoolean = .init(value: false, isFromSinkCall: true)
            }
            .store(in: &subscribers)
    }
}