在没有收到更多事件后将 @Published var 设置为 nil
Setting an @Published var to nil after no more events are received
考虑以下代码:
class MyController: NSObject, ObservableObject {
//...
@Published var myRapidlyChangingVar: MyEnum? = nil
//...
func calledAtHighFrequencyByExternalEvents(value: MyEnum) {
myRapidlyChangingVar = value
}
}
如果 1 秒内没有调用 calledAtHighFrequencyByExternalEvents()
,则 myRapidlyChangingVar
的值需要设置为 nil
。
实现此目标最简单、最干净的方法是什么?
让我印象深刻的是反应式编程应该使之变得非常简单,但不确定从哪里开始或要搜索什么。
您可以使用 debounce(for:scheduler:options:)
轻松实现此目的
let cancellable = myRapidlyChangingVar
.compactMap { [=10=] }
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.sink { [weak self] _ in self?.myRapidlyChangingVar = nil }
}
Debounce 有一个非常相似的兄弟throttle(for:scheduler:latest:)
您可以在 this blogpost 中阅读更多关于两者的信息。
考虑以下代码:
class MyController: NSObject, ObservableObject {
//...
@Published var myRapidlyChangingVar: MyEnum? = nil
//...
func calledAtHighFrequencyByExternalEvents(value: MyEnum) {
myRapidlyChangingVar = value
}
}
如果 1 秒内没有调用 calledAtHighFrequencyByExternalEvents()
,则 myRapidlyChangingVar
的值需要设置为 nil
。
实现此目标最简单、最干净的方法是什么?
让我印象深刻的是反应式编程应该使之变得非常简单,但不确定从哪里开始或要搜索什么。
您可以使用 debounce(for:scheduler:options:)
let cancellable = myRapidlyChangingVar
.compactMap { [=10=] }
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.sink { [weak self] _ in self?.myRapidlyChangingVar = nil }
}
Debounce 有一个非常相似的兄弟throttle(for:scheduler:latest:)
您可以在 this blogpost 中阅读更多关于两者的信息。