我在一个类中声明了一个变量,代码如下:
@NSManaged var isFavorite: Bool
我想声明一个属性观察器,与下面的代码非常相似。
var organization: String {
didSet { postNotificationWithName( "newData" ) }
}
然而,Swift告诉我在NSManaged
变量上使用属性观察器是不允许的。是否有任何方法可以实现类似于isFavorite
变量的这种功能或类似的功能?
我在一个类中声明了一个变量,代码如下:
@NSManaged var isFavorite: Bool
我想声明一个属性观察器,与下面的代码非常相似。
var organization: String {
didSet { postNotificationWithName( "newData" ) }
}
然而,Swift告诉我在NSManaged
变量上使用属性观察器是不允许的。是否有任何方法可以实现类似于isFavorite
变量的这种功能或类似的功能?
是的——删除@NSManaged
。这不是绝对必需的,但如果您删除它,则不幸需要为属性实现get
和set
。您需要添加类似以下内容:
只有当您想要在属性上进行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
。
NSManaged
的原因是我需要使用Core Data(作为Parse本地数据存储的一部分)将该变量缓存到本地。有没有解决方法? - Satre@NSManaged
。上面的代码仍将数据保存到持久存储中。 - Tom HarringtonAttendee
类没有名为 setPrimitiveValue
和 didAccessValueForKey
的成员。 - SatreNSManagedObject
的类都实现了setPrimitiveValue(_:,key:)
和didAccessValueForKey(_:)
。如果你遇到这些错误,那么要么你没有子类化NSManagedObject
,要么你方法签名写错了。 - Tom Harrington糟糕!Paul Patterson是正确的。你应该使用键值观察 - 这正是我建议的链接中所说的。
请参考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>) {
覆盖 NSManagedObject
的 func didChangeValue(forKey key: String)
方法,请参阅(https://developer.apple.com/documentation/coredata/nsmanagedobject/1506976-didchangevalue)
postNotificationWithName()
方法来自哪里? - Jon Shier