如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?
Posted
技术标签:
【中文标题】如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?【英文标题】:How can I use a Transformable attribute as its actual type in a NSManagedObject subclass? 【发布时间】:2016-01-19 07:02:48 【问题描述】:刚刚开始一个项目。数据模型文件有一个实体,该实体具有一个可转换的属性。它应该是NS/CGRect
。我让 Xcode 创建了相应的 NSManagedObject
子类文件。对于“MyThing.swift”,我得到:
import Foundation
import CoreData
class MyThing: NSManagedObject
// Insert code here to add functionality to your managed object subclass
我得到了一个“MyThing+CoreDataProperties.swift”:
import Foundation
import CoreData
extension MyThing
@NSManaged var myBounds: NSObject?
我希望该属性是一个实际的CGRect
,所以我需要一个NSData <-> NSValue <-> NSRect
转换链。我已经将“NSKeyedUnarchiveFromDataTransformer”作为接口生成器中属性类型下的名称。我应该添加(和/或更改)什么来传递 CGRect
值?
或者我不这样做,而只是传递NSValue
-wrapped CGRect
s? (我希望 CoreData 能够处理任何 NSData <-> NSValue
转换。)
【问题讨论】:
我摆脱了子类(和扩展)并直接传递NSValue
-wrapped CGRect
s。我仍然想知道最好的主意是什么,以防我需要再次处理这个问题。
【参考方案1】:
只要您的可转换类型符合 NSCoding,Core Data 就会为您处理剩下的事情。我在我的NSManagedObjects
中使用了NSAttributedString
,并且只更改了CoreData 提供的id
-type,它是在运行时生成的。
如果您想拥有自己类型的属性,即MyAwesomeObject
,请确保实现initWithCoder:
和encodeWithCoder:
。
因此,对于您的情况,为了将 CGRects
与 CoreData 一起存储,您需要将它们包装在实现上述方法的类中。这是因为 CGRect 不符合 NSCoding 协议,因此不能直接存储为可转换属性。
您的另一个选择当然是将x
,y
,width
,height
存储为属性,并且要么具有您在awakeFromFetch
和awakeFromInsert
中计算的瞬态属性,要么只是为了方便方法。
【讨论】:
awakeFromNib
?你的意思是awakeFromFetch
和awakeFromSnapshotEvents
?
呸。错字。我的意思是awakeFromFetch
。现在修好了!感谢您的关注!
我将CGRect
值包装在NSValue
对象中。我想知道苹果在实现非标准持久属性方面有什么想法,比如NSColor
或NSRect
(通过子类或其他方式)。也许有示例代码....
NSValue 符合 NSCoding,所以我假设这是 Apple 考虑的非标准持久属性...【参考方案2】:
因为 CGRect 不是类而是结构,我建议创建另一个属性,该属性将通过适当的转换访问原始变量。然后只使用该属性。
class MyThing
var boundsValue : NSValue?
extension MyThing
var bounds : CGRect
get
if let value = boundsValue
value.CGRectValue()
return CGRectNull
set
boundsValue = NSValue(CGRect: newValue)
【讨论】:
以上是关于如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?的主要内容,如果未能解决你的问题,请参考以下文章
当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?