2009-09-11 66 views
0

在用于核心数据栈生成的代码,保存上managedObjectContext问题被称为在applicationWillTerminate方法。这是在退出前处理上下文中所有未保存的对象。与xcode中生成的核心数据栈代码逻辑和核心数据样本代码

这也有保存任何临时对象的不良副作用。 (这个问题在苹果示例代码中也是可见的,如果您点击+在食谱示例代码中添加新食谱,然后按主页按钮以终止该应用程序,则下次启动该应用程序时会看到半分食谱对象)。

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

  1. 对临时对象使用不同的暂存器managedObjectContext,当您决定真正保存时,然后在主managedObjectContext中推送副本。仅在applicationWillTerminate中的主managedObjectContext上调用保存。 (有没有简单,快捷的方式从一个managedObjectContext在新的上下文手动创建副本将对象移动到另一个分开?)
  2. 删除applicationWillTerminate保存,但要确保所有的对象都保存更改后立即。 (这可能并不容易,我有一个Tabbed应用程序,用户可能同时启动编辑操作)。

让我知道是否有更好的方式来处理这个问题。

回答

0

溶液1确实意味着复制对象。 该示例在CoreDataBooks示例中进行了说明。您可以在第二个上下文中创建新对象,然后通过观察NSManagedObjectContextObjectsDidChangeNotification并将更改合并到主上下文中,直接(使用objectWithID :)或(如示例中所示和解释的)将它们错误置于主上下文中。

+0

这是绝对是更新更新的更好方法,因为CD可以完成集成更改的所有工作。 – siasl 2011-01-12 14:05:43

+0

请参考addViewController中的注释:(AddViewController *)控制器didFinishWithSave:(BOOL)保存在CoreDataBooks示例的RootViewController.m中,以获取上述详细说明。 – siasl 2011-01-12 14:06:26

0

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

方案二可能更容易根据你的应用程序逻辑来实现,正如你提到的,GUI。

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

- (NSSet *)insertedObjects 

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

请注意,这可能是相当昂贵的,具体取决于对象的数量。

+0

您对解决方案1是对的。这可能会很棘手。与解决方案2相结合的第三个解决方案应该适合我。我倾向于在用户提交更改后立即保存。它仅适用于用户可能正在添加新实例并决定终止该应用程序的情况。检查insertionObjects将在那里工作,因为我不期望太多的临时对象。感谢您的建议。 – siasl 2009-09-11 23:35:51

+0

增加了新的逻辑,像魅力一样工作...... – siasl 2009-09-12 02:19:48

+0

很高兴知道;-) – 2009-09-12 06:32:10