【问题标题】:Concurrent changes to NSManagedObjectContext - how and when to save对 NSManagedObjectContext 的并发更改 - 如何以及何时保存
【发布时间】:2012-12-24 07:09:01
【问题描述】:

我的应用有时会在托管对象上下文中插入不一定要保存的对象。例如,当我启动“添加实体”模式时,我会创建一个托管对象并将其分配给该模式。如果用户从该模式保存,我保存上下文。如果他取消,我会删除该对象并且不需要保存。

我现在引入了一个“导入”功能,它可以切换到我的应用程序(使用 URL 方案)并添加一个实体。因为这些模态之一可能是打开的,所以此时保存上下文是不安全的。为模态创建的瞬态对象将被保存,即使用户取消,也不能保证稍后会保存删除(来自取消操作) - 用户可能会退出应用程序。

同样,每当我的应用退出时,我也不能简单地保存。如果此时模态框处于打开状态,则临时对象将被错误地保存。

我正在寻找一种策略来处理这种架构。我正在考虑一些允许我识别导入实体的“标记”解决方案。当用户用户退出应用程序时,我将检查上下文是否有任何未保存的更改。如果是这样,我将过滤掉除导入实体之外的所有内容,然后保存。我不知道这是否可能(选择性保存)或一个好主意。

【问题讨论】:

  • 听起来您的模态应该使用单独的上下文,这样您就可以保存主要上下文而不会意外地从模态中获取正在进行的更改。
  • 这里有很棒的文章:cocoanetics.com/2012/07/multi-context-coredata,关于将子上下文用于不同的扫描,包括你描述的那个。
  • 谢谢大家 - 我已经阅读了几次链接的博客并正在尝试实施。我有一些问题,但到目前为止感觉是正确的道路。我将添加我自己的答案,详细说明我的解决方案是否有效。
  • 这些是我(当前)未解决的问题:stackoverflow.com/questions/14284301/…

标签: ios objective-c cocoa-touch architecture nsmanagedobjectcontext


【解决方案1】:

Kevin 和 Andrew 的 cmets(以及链接的文章)足以让我继续前进。我在this question 中得到了一些后续建议。

总之,我使用子上下文来创建瞬态对象,然后将其合并到主上下文中。实际上,我只需要临时上下文作为插入对象的位置 - 例如,如果可以在插入消息之外创建它,我可以这样做,然后在确认时将其直接插入主上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2011-03-02
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2017-01-09
    相关资源
    最近更新 更多