在生成的核心数据堆栈代码中,在applicationWillTerminate方法中调用了managedObjectContext的保存。这是在退出之前处理上下文中所有未保存的对象。
这也有保存任何临时对象的不良副作用。 (此问题在Apple示例代码中也是可见的。如果您单击+在Recipe示例代码中添加新配方,然后按Home键终止应用程序,则下次启动应用程序时可以看到完成一半的Recipe对象)。
处理此问题的首选设计模式是什么?我能想到以下几点。
如果有更好的方法来解决这个问题,请告诉我。
答案 0 :(得分:0)
解决方案1需要完全复制对象。但是,复制对象很棘手。属性可以轻松处理,但关系是微妙的。要复制关系(深层复制,而不是浅层复制),您需要一个递归过程,在递归过程中,如果在递归步骤中再次遇到,则始终注意不要一遍又一遍地复制同一个对象。
解决方案2可能更容易实现,具体取决于您的应用程序逻辑,如您所述,GUI。
第三种方法可以正确处理临时对象,如下所示。将一个布尔属性添加到与对象关联的实体,以跟踪对象状态(临时或非临时)。然后,使用NSManagedObjectContext方法
- (NSSet *)insertedObjects
您只需枚举对象集,并根据布尔标志的值保存或删除对象。
请注意,根据对象的数量,这当然可能非常昂贵。
答案 1 :(得分:0)
解决方案1 不需要复制对象。 该模式在CoreDataBooks示例中说明。您可以在第二个上下文中创建新对象,然后通过观察NSManagedObjectContextObjectsDidChangeNotification并将更改合并到主上下文中,直接(使用objectWithID :)或(如示例中所示和解释)将它们置于主上下文中。