在NSManaged变量上使用属性观察器

31

我在一个类中声明了一个变量,代码如下:

@NSManaged var isFavorite: Bool

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

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

然而,Swift告诉我在NSManaged变量上使用属性观察器是不允许的。是否有任何方法可以实现类似于isFavorite变量的这种功能或类似的功能?


你想发布通知还是支持键值观察,或者两者都要?postNotificationWithName() 方法来自哪里? - Jon Shier
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
38

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

只有当您想要在属性上进行KVO时才需要@objc

@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


2
我将变量声明为NSManaged的原因是我需要使用Core Data(作为Parse本地数据存储的一部分)将该变量缓存到本地。有没有解决方法? - Satre
4
如果您像答案中的那样实现访问器,使用Core Data时不需要使用@NSManaged。上面的代码仍将数据保存到持久存储中。 - Tom Harrington
Xcode 给我报错,说我的 Attendee 类没有名为 setPrimitiveValuedidAccessValueForKey 的成员。 - Satre
每个子类化NSManagedObject的类都实现了setPrimitiveValue(_:,key:)didAccessValueForKey(_:)。如果你遇到这些错误,那么要么你没有子类化NSManagedObject,要么你方法签名写错了。 - Tom Harrington
1
@M090009 如果不是这样,那么你的实现肯定有问题。你应该提出一个详细呈现你代码的新问题。 - Tom Harrington
显示剩余5条评论

4

糟糕!Paul Patterson是正确的。你应该使用键值观察 - 这正是我建议的链接中所说的。

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

请参考Swift笔记: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html(使用页面右上角的“On This Page”菜单查看Key-Value Observing)

因此,类似于:

objectToObserve.addObserver(self, forKeyPath: "organization", options: .New, context: &myContext)
配对的
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

1
值得指出的是,您引用的文档明确警告您不应覆盖此方法。 - Paul Patterson

-2

2
文档明确地指出:“你不应该覆盖这个方法。” - Koraktor
请确保您调用了该方法的继承版本。 - Wizard of Kneup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,