【问题标题】:Setting an @Published var to nil after no more events are received在没有收到更多事件后将 @Published var 设置为 nil
【发布时间】:2021-12-29 06:41:49
【问题描述】:

考虑以下代码:

class MyController: NSObject, ObservableObject {

    //...

    @Published var myRapidlyChangingVar: MyEnum? = nil

    //...

    func calledAtHighFrequencyByExternalEvents(value: MyEnum) {
        myRapidlyChangingVar = value
    }
}

如果 1 秒内没有调用 calledAtHighFrequencyByExternalEvents(),则需要将 myRapidlyChangingVar 的值设置为 nil。

实现这一目标的最简单、最简洁的方法是什么?

让我印象深刻的是,响应式编程应该使事情变得非常简单,但不确定从哪里开始或搜索什么。

【问题讨论】:

    标签: swift reactive-programming combine


    【解决方案1】:

    您可以通过debounce(for:scheduler:options:) 轻松实现这一目标

    let cancellable = myRapidlyChangingVar
        .compactMap { $0 }
        .debounce(for: .seconds(1), scheduler: DispatchQueue.main)
        .sink { [weak self] _ in self?.myRapidlyChangingVar = nil }
    }
    

    Debounce 有一个非常相似的兄弟throttle(for:scheduler:latest:)

    您可以在this blogpost 中阅读有关这两个方面的更多信息。

    【讨论】:

    • 非常感谢 Witek - 它确实有效。另一位开发人员评论说,出于性能原因,对compactMap() 的调用应该移到debounce() 之前。
    • 很高兴它为您解决了问题。移动compactMap的好点,我会更新我的答案:)
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多