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

Iphone xCode生成的核心数据堆栈代码逻辑和核心数据示例代码出现问题,iphone,core-data,Iphone,Core Data,在为核心数据堆栈生成的代码中,在applicationWillTerminate方法中调用save on managedObjectContext。这是为了在退出之前处理上下文中所有未保存的对象 这还有一个不必要的副作用,即保存任何临时对象。(此问题在apple示例代码中也可见。如果您单击+在配方示例代码中添加新配方,然后按Home按钮终止应用程序,则下次启动应用程序时,会看到半成品配方对象) 处理此问题的首选设计模式是什么?我可以想到以下几点 对临时对象使用不同的scratchpad mana

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

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

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

  • 对临时对象使用不同的scratchpad managedObjectContext,并在决定真正保存时,在主managedObjectContext中推送副本。仅在applicationWillTerminate中的主managedObjectContext上调用save。(除了在新上下文中手动创建副本外,还有什么简单快捷的方法可以将对象从一个managedObjectContext移动到另一个managedObjectContext?)
  • 从应用程序中删除保存将终止,但请确保在进行更改后立即保存所有对象。(这可能并不总是那么容易,我有一个选项卡式应用程序,用户可能同时启动了编辑操作)

  • 请告诉我是否有更好的方法来处理此问题。

    解决方案1需要完全复制对象。但是,复制对象很棘手。属性很容易处理,但关系很微妙。要复制关系(深度复制,而不是浅层复制),您需要一个递归过程,在该过程中,如果在递归步骤中再次遇到相同的对象,请始终注意不要重复复制同一对象

    解决方案2可能更容易实现,这取决于您的应用程序逻辑和GUI(如您所述)

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

    - (NSSet *)insertedObjects
    
    您只需枚举对象集,并根据布尔标志的值保存或删除对象

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

    解决方案1不需要复制对象。
    该模式在示例中进行了说明。您可以在第二个上下文中创建新对象,然后直接(使用objectWithID:)或(如示例中所示和解释)将其插入主上下文,方法是观察NSManagedObjectContextObjectsIDChangeNotification并将更改合并到主上下文中。

    解决方案1是正确的。这可能很棘手。第三种解决方案与第二种解决方案相结合,对我来说应该很好。我倾向于在用户提交更改后立即保存。它只适用于用户可能正在添加新实例的中间场景,然后决定终止应用程序。检查InsertedObject在那里也可以,因为我也不希望有太多的临时对象。感谢您的建议。这绝对是更新更改的更好方法,因为CD完成了集成更改的所有工作。有关上述详细说明,请参阅addViewController:(addViewController*)controller didFinishWithSave:(BOOL)CoreDataBooks示例中的RootViewController.m中的注释。