【问题标题】:Issue with xCode generated core data stack code logic and core data sample codexCode 生成的核心数据堆栈代码逻辑和核心数据示例代码的问题
【发布时间】:2009-09-11 00:49:24
【问题描述】:

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

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

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

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

如果有更好的处理方法,请告诉我。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

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

    【讨论】:

    • 这绝对是更新更改的更好方法,因为 CD 完成了集成更改的所有工作。
    • 上面的详细解释请参考CoreDataBooks示例中RootViewController.m中addViewController:(AddViewController *)controller didFinishWithSave:(BOOL)save中的cmets。
    【解决方案2】:

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

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

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

    - (NSSet *)insertedObjects
    

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

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

    【讨论】:

    • 您对解决方案 1 的看法是正确的。这可能很棘手。与解决方案 2 相结合的第 3 个解决方案对我来说应该可以正常工作。我倾向于在用户提交更改后立即保存。它仅适用于用户可能正在添加新实例然后决定终止应用程序的情况。对insertedObjects 的检查将在那里工作,因为我也不希望有太多的临时对象。感谢您的建议。
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多