【问题标题】:Observing multiple published variable changes inside ObservableObject在 ObservableObject 中观察多个已发布变量的变化
【发布时间】:2021-10-03 13:20:40
【问题描述】:

我有一个 ObservableObject,其中包含多个已发布的变量来处理我的应用程序状态。 每当其中一个已发布的变量发生变化时,我都想在ObservableObject 中调用一个函数。最好的方法是什么?

class AppModelController: ObservableObject {

    @Published var a: String = "R"
    @Published var b: CGFloat = 0.0
    @Published var c: CGFloat = 0.9
    
    // Call this function whenever a, b or c change
    func check() -> Bool {

    }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可以做的最简单的事情就是收听objectWillChange。问题是它在对象更新之前 被调用。您可以使用.receive(on: RunLoop.main) 获取下一个循环的更新,这将反映更改的值:

    import Combine
    
    class AppModelController: ObservableObject {
    
        @Published var a: String = "R"
        @Published var b: CGFloat = 0.0
        @Published var c: CGFloat = 0.9
        
        private var cancellable : AnyCancellable?
        
        init() {
            cancellable = self.objectWillChange
            .receive(on: RunLoop.main)
            .sink { newValue in
                let _ = self.check()
            }
        }
        
        // Call this function whenever a, b or c change
        func check() -> Bool {
            return true
        }
    }
    

    【讨论】:

    • 谢谢,@jnpdx。我觉得我遵循的模式不正确。有没有其他方法可以达到相同的结果,但以更“标准”的方式,或者这就是它? :)
    • 这正是这个(或另一个答案中的didSet 方法)。我个人喜欢这种方法,因为如果我添加/删除一个属性,它仍然可以工作。
    • @Hamid 你没有在这里投票。你觉得这两个答案有什么帮助吗?
    • 我将在今天或明天测试两个答案,然后再回到这里。感谢您的帮助。
    【解决方案2】:

    你可以使用 didSet,像这样的代码:

    class AppModelController: ObservableObject {
    
        @Published var a: String = "R" { didSet(oldValue) { if (a != oldValue) { check() } } }
        @Published var b: CGFloat = 0.0 { didSet(oldValue) { if (b != oldValue) { check() } } }
        @Published var c: CGFloat = 0.9 { didSet(oldValue) { if (c != oldValue) { check() } } }
        
    
        func check() {
            
            // Some Work!
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-20
      • 2013-12-03
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      相关资源
      最近更新 更多