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

问题描述:

我想在Swift中制作一个天气应用程序,它将保存我添加到核心数据中的城市,每个城市都包含一个天气对象,该对象也保存到核心数据和其他各种变量中。我很快就发现,在核心数据上下文之外使用核心数据NSManagedObjects子类几乎是不可能的(处理NSNumber和类似的问题,没有自定义的初始化,*将它们保存在某处,如果我明天停止使用核心数据, ...)。如何在Core Data上下文之外使用Core Data模型子类?

那么,继续使用核心数据的最佳做法是什么,但是还要在上下文之外使用模型?

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

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

是对应的类:

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

所以我可以用City任何地方,反正我想要的。但我需要一个func将City变成CD_City和相反。所以我真的不确定我是否是最好的方法。 另外你会推荐什么样的转换方法?

(FYI我使用MagicalRecord作为核心数据助手)

TL; DR - 不要做的事或将打破。

曾经有过各种各样的黑客来获取它的工作,但他们都依赖于CoreData中的无证行为。我会从来没有在代码中使用类似的东西我想展示另一个人,更少的客户。 CoreData需要在你的模型对象中插入proxy objects,并将其挂钩到property change events,并且它唯一能够可靠地做到这一点并跟踪原始数据值的方法是,如果它负责首先创建这些实体;这也使faulting & uniquing system工作。不要将核心数据视为ORM,它确实是一个object graph management framework,因此它被设计成以某种方式使用,没有简单的解决方案来安全地安全

+0

所以也不推荐我的解决方案?例如,你如何在ViewController中使用你的模型?我的意思是,在我的情况下,我想根据用户的位置创建一个城市,但我不想将它保存到Core Data,根据你我是不行的? – allbto

+0

CD从头开始设计以管理自己的物体及其创作。请不要使用核心数据,或者将您的对象作为协议传递到控制器中。您的CD实体可以实现该协议,因为可以使不在CD中的“哑”对象,并且您的控制器将不知道其差异。我鼓励你重新审视哪些需求导致你使用CoreData - 可能有另一种持久性机制可以满足你的需求,并且没有CD的包袱。 – RyanR

+0

我花了很长时间才找到这个链接:[YAPDatabase](https:// github。com/yapstudios/YapDatabase)非常好。 – RyanR

如果你不想保存NSManagedObject或它的一个子类,那么你就可以

init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 

创建并传递nilinsertIntoManagedObjectContext这将创建你的实例,但它会不会是保存到了商务部。

如果你要稍后保存到MOC,您可以使用NSMangedObjectContext的

func insertObject(_ object: NSManagedObject) 
+0

我会尝试一下,谢谢! – allbto