【问题标题】:Using property observers on NSManaged vars在 NSManaged vars 上使用属性观察器
【发布时间】:2015-07-24 01:49:34
【问题描述】:

我在这样的类中声明了一个 var:

@NSManaged var isFavorite: Bool

我想声明一个属性观察者,与下面的非常相似。

 var organization: String {
        didSet { postNotificationWithName( "newData" ) }
    }

但是,Swift 告诉我,不允许在 NSManaged vars 上设置属性观察者。有什么方法可以为我的isFavorite 变量实现这样的功能或类似的东西?

【问题讨论】:

  • 您要发布通知还是支持键值观察者,还是两者兼而有之? postNotificationWithName() 来自哪里?

标签: ios swift nsmanagedobject observers


【解决方案1】:

是的——删除@NSManaged。这不是绝对必需的,但如果您删除它,不幸的是您需要为该属性实现getset。您需要添加类似

@objc 仅在您希望能够对属性进行 KVO 时才需要。

@objc public var newData: String? {
    set {
        willChangeValue(forKey: "newData")
        setPrimitiveValue(newValue, forKey: "newData")
        didChangeValue(forKey: "newData")
    }
    get {
        willAccessValue(forKey: "newData")
        let text = primitiveValue(forKey: "newData") as? String
        didAccessValue(forKey: "newData")
        return text
    }
}

如果您实际上并不需要它们,那么实现这两种方法有点烦人,但目前就是这样。

由于您将拥有set,因此您可能不需要didSet,但如果需要,您仍然可以添加didSet

【讨论】:

  • 我将变量声明为NSManaged 的原因是我需要使用Core Data(作为Parse 本地数据存储的一部分)在本地缓存该变量。有办法解决吗?
  • 如果您实现答案中的访问器,则在使用 Core Data 时不需要使用 @NSManaged。上面的代码仍然将数据保存到持久存储中。
  • Xcode 给我一个错误,我的 Attendee 类没有名为 setPrimitiveValuedidAccessValueForKey 的成员。
  • 每个子类NSManagedObject 实现setPrimitiveValue(_:,key:)didAccessValueForKey(_:)。如果您遇到这些错误,那么要么您没有继承 NSManagedObject,要么您的方法签名错误。
  • @M090009 如果不是,那么您的实现有问题。您应该提出一个新问题,详细介绍您的代码。
【解决方案2】:

哎呀!保罗帕特森是对的。你应该使用的是 Key Value Observing - 这正是我建议的链接中所说的你应该做的事情。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

另见快速注释: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (使用页面右上角的“在此页面上”菜单进行键值观察)

类似

objectToObserve.addObserver(self, forKeyPath: "organization", options: .New, context: &myContext)

配对

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

【讨论】:

  • 值得指出的是,您引用的文档明确警告您不应覆盖此方法。
【解决方案3】:

覆盖 NSManagedObjectfunc didChangeValue(forKey key: String) 参见 (https://developer.apple.com/documentation/coredata/nsmanagedobject/1506976-didchangevalue)

【讨论】:

  • 文档清楚地写着:“你不能重写这个方法。”
猜你喜欢
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2020-08-15
  • 2013-06-05
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多