【问题标题】:Is there a way to detect changes in a Swift ObservableObject by hooking into the subscriber pipeline without all the didChange plumbing?有没有办法通过在没有所有 didChange 管道的情况下连接到订阅者管道来检测 Swift ObservableObject 中的变化?
【发布时间】:2020-10-03 09:59:17
【问题描述】:

我正在使用各种视图模型对象创建一个 SwiftUI 应用程序来支持视图。在某些视图上,用户可以在不保存更改的情况下离开,例如'取消' 如果底层视图模型有任何更改,我想提示确认。 一些视图模型具有许多可以设置/更改的属性,因此我试图避免必须更改每个 @Published 属性以使用 didChange 方法来捕获更改,因为这将是很多丑陋的管道觉得没必要。由于对象的订阅者可以检测到更改,我想知道是否有一种方法可以让我自己挂钩,以便我可以对已发布的对象更改做出反应,然后设置 hasChanges 标志。

非常感谢任何帮助/建议。

class MySimpleViewModel: ObservableObject {
    @Published var firstName: String
    @Published var lastName: String
    @Published var age: Int
    // I want to be able to set this automatically by hooking into the pub/sub pipeline.
    var hasChanges: Bool = false
    
    init (firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }
}

【问题讨论】:

    标签: swift swiftui observableobject


    【解决方案1】:

    一个简单的解决方案是,将这部分代码更改为:

    @Published private(set) var hasChanges: Bool = false
    
    init(firstName: String, lastName: String, age: Int) {
      self.firstName = firstName
      self.lastName = lastName
      self.age = age
    
      objectWillChange
        .first()
        .map { true }
        .assign(to: &$hasChanges)
    }
    

    但是,因为任何东西都可以订阅objectWillChange,所以您可能需要重新考虑将这些信息存储在对象本身中。

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 2021-11-30
      • 2018-07-07
      • 1970-01-01
      • 2021-08-04
      • 2021-04-11
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多