繁体   English   中英

xCode生成的核心数据堆栈代码逻辑和核心数据样本代码存在问题

[英]Issue with xCode generated core data stack code logic and core data sample code

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

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

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

  1. 对临时对象使用另一暂存器managedObjectContext,当您决定真正保存时,然后将副本推入主managedObjectContext中。 仅在applicationWillTerminate的主managedObjectContext上调用保存。 (除了在新的上下文中手动创建副本之外,是否有任何简便快捷的方法将对象从一个ManagedObjectContext移动到另一个对象?)
  2. 从applicationWillTerminate中删除保存,但是请确保在进行更改后立即保存所有对象。 (这可能一直都不容易,我有一个Tabbed应用程序,用户可能同时启动了编辑操作)。

让我知道是否有更好的方法来处理此问题。

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

解决方案2可能更容易实现,具体取决于您的应用程序逻辑以及您提到的GUI。

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

- (NSSet *)insertedObjects

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

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

解决方法1 并不意味着复制对象。 CoreDataBooks示例中说明了该模式。 您可以在第二个上下文中创建新对象,然后通过观察NSManagedObjectContextObjectsDidChangeNotification将更改直接合并到主上下文中(使用objectWithID :)或(如示例中所示和说明)并将其合并到主上下文中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM