合并:在 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
使用自定义类型 MyBool
和 filter
运算符,您可以获得类似的行为。
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)
}
}
我有以下代码:
$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
使用自定义类型 MyBool
和 filter
运算符,您可以获得类似的行为。
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)
}
}