xCode生成核心数据堆栈代码逻辑和核心数据示例代码的问题

时间:2009-09-11 00:49:24

标签: iphone core-data

在生成的核心数据堆栈代码中,在applicationWillTerminate方法中调用了managedObjectContext的保存。这是在退出之前处理上下文中所有未保存的对象。

这也有保存任何临时对象的不良副作用。 (此问题在Apple示例代码中也是可见的。如果您单击+在Recipe示例代码中添加新配方,然后按Home键终止应用程序,则下次启动应用程序时可以看到完成一半的Recipe对象)。

处理此问题的首选设计模式是什么?我能想到以下几点。

  1. 对临时对象使用不同的暂存器managedObjectContext,当您决定真正保存时,请在主要的managedObjectContext中推送一个副本。仅在applicationWillTerminate中的主要managedObjectContext上调用save。 (除了在新上下文中手动创建副本之外,有没有简单快捷的方法将对象从一个managedObjectContext移动到另一个?)
  2. 从applicationWillTerminate中删除save,但确保在更改后立即保存所有对象。 (这可能不容易,我有一个Tabbed应用程序,用户可能同时启动了编辑操作。)
  3. 如果有更好的方法来解决这个问题,请告诉我。

2 个答案:

答案 0 :(得分:0)

解决方案1需要完全复制对象。但是,复制对象很棘手。属性可以轻松处理,但关系是微妙的。要复制关系(深层复制,而不是浅层复制),您需要一个递归过程,在递归过程中,如果在递归步骤中再次遇到,则始终注意不要一遍又一遍地复制同一个对象。

解决方案2可能更容易实现,具体取决于您的应用程序逻辑,如您所述,GUI。

第三种方法可以正确处理临时对象,如下所示。将一个布尔属性添加到与对象关联的实体,以跟踪对象状态(临时或非临时)。然后,使用NSManagedObjectContext方法

- (NSSet *)insertedObjects

您只需枚举对象集,并根据布尔标志的值保存或删除对象。

请注意,根据对象的数量,这当然可能非常昂贵。

答案 1 :(得分:0)

解决方案1 ​​需要复制对象。 该模式在CoreDataBooks示例中说明。您可以在第二个上下文中创建新对象,然后通过观察NSManagedObjectContextObjectsDidChangeNotification并将更改合并到主上下文中,直接(使用objectWithID :)或(如示例中所示和解释)将它们置于主上下文中。