如何在 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 CGRects? (我希望 CoreData 能够处理任何 NSData <-> NSValue 转换。)

【问题讨论】:

我摆脱了子类(和扩展)并直接传递NSValue-wrapped CGRects。我仍然想知道最好的主意是什么,以防我需要再次处理这个问题。 【参考方案1】:

只要您的可转换类型符合 NSCoding,Core Data 就会为您处理剩下的事情。我在我的NSManagedObjects 中使用了NSAttributedString,并且只更改了CoreData 提供的id-type,它是在运行时生成的。

如果您想拥有自己类型的属性,即MyAwesomeObject,请确保实现initWithCoder:encodeWithCoder:

因此,对于您的情况,为了将 CGRects 与 CoreData 一起存储,您需要将它们包装在实现上述方法的类中。这是因为 CGRect 不符合 NSCoding 协议,因此不能直接存储为可转换属性。

您的另一个选择当然是将x,y,width,height 存储为属性,并且要么具有您在awakeFromFetchawakeFromInsert 中计算的瞬态属性,要么只是为了方便方法。

【讨论】:

awakeFromNib?你的意思是awakeFromFetchawakeFromSnapshotEvents 呸。错字。我的意思是awakeFromFetch。现在修好了!感谢您的关注! 我将CGRect 值包装在NSValue 对象中。我想知道苹果在实现非标准持久属性方面有什么想法,比如NSColorNSRect(通过子类或其他方式)。也许有示例代码.... 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 子类?

核心数据。如何使用在 NSManagedObject 子类中创建的方法

为啥会有一个子类 NSManagedObject?

如何在类之间传输 NSManagedObject 子类?

NSManagedObject 验证和子类

如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?