如何在Core Data上下文之外使用Core Data模型子类?

时间:2015-05-21 19:22:14

标签: ios swift core-data magicalrecord

我试图在Swift中创建一个天气应用程序来保存我添加到Core Data的城市,每个城市都包含一个天气对象,该对象也保存到Core Data和其他各种变量中。

但我很快发现,使用Core Data NSManagedObjects子类在Core Data上下文几乎是不可能的(处理NSNumber和类似的,没有自定义init,被迫将它们保存在某个地方,如果我明天停止使用Core Data,那该怎么办? ..)。

那么继续使用核心数据以及在其背景之外使用模型的最佳做法是什么?

我现在的解决方案是为每个模型创建一个类,所以:

class City
{
    var country: String?
    var name: String?
    // ...
}

是否对应的类:

class CD_City
{
    @NSManaged var country: String?
    @NSManaged var name: String?
    // ...
}

所以我可以在任何地方使用City,无论如何我想要。但是我需要一个函数来将City转换为CD_City并且相反。所以我真的不确定我是以最好的方式做到这一点。 您还推荐什么作为转换方法?

(仅供参考我使用MagicalRecord作为核心数据助手)

2 个答案:

答案 0 :(得分:4)

TL; DR - 不要这样做或事情会破裂。

曾经存在各种各样的黑客攻击,但它们都依赖于CoreData中的未记录行为。我会永远在代码中使用类似的东西,我想展示另一个人,更不用说向客户发货了。 CoreData需要在模型对象上插入挂钩到proxy objectsproperty change events,并且它能够可靠地执行此操作并跟踪原始数据值的唯一方法是,它是否负责在第一个中创建这些实体地点;这也使faulting & uniquing system起作用。不要将Core Data视为ORM,它实际上是object graph management framework,因此它被设计为以某种方式使用而没有简单的解决方案来安全。

答案 1 :(得分:1)

如果您不想保存NSManagedObject或其子类,则可以使用

创建它
init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)

并为nil传递insertIntoManagedObjectContext这会创建一个实例,但不会保存到MOC。

如果您以后必须将其保存到MOC,可以使用NSMangedObjectContext&#39>

func insertObject(_ object: NSManagedObject)