为啥在没有明确合并的情况下,更改可能会从一个 NSManagedObjectContext 填充到另一个?

Posted

技术标签:

【中文标题】为啥在没有明确合并的情况下,更改可能会从一个 NSManagedObjectContext 填充到另一个?【英文标题】:Why might changes be populated from one NSManagedObjectContext to another without an explicit merge?为什么在没有明确合并的情况下,更改可能会从一个 NSManagedObjectContext 填充到另一个? 【发布时间】:2010-03-18 19:57:27 【问题描述】:

我正在开发一个利用多线程/NSManagedObjectContexts 的对象导入功能,使用http://www.mac-developer-network.com/columns/coredata/may2009/ 作为我的指南(请注意,我正在为 iPhone 开发)。

由于某种原因,当我保存其中一个上下文时,另一个上下文会立即更新更改,即使我已经注释掉了对 mergeChangesFromContextDidSaveNotification 的调用。在没有明确调用的情况下,上下文可能会相互合并,是否有任何原因?

这里是发生了什么的日志:

// 1.) Main context is saved with "Peter Gabriel"
// 2.) Test context is created, begins with same contents as main context
// 3.) Main context is inserted with "Spoon"
// 4.) Test context is inserted with "Phoenix"

// Contents at this point:

CoreTest[4341:903] Artists in main context: (
    "Peter Gabriel",
    "Spoon"
)
CoreTest[4341:903] Artists in test context: (
    "Peter Gabriel",
    "Phoenix"
)

// 5.) testContext is saved

// New contents of contexts:

CoreTest[4341:903] Artists in main context: (
    "Peter Gabriel",
    "Phoenix",
    "Spoon"
)
CoreTest[4341:903] Artists in test context: (
    "Peter Gabriel",
    "Phoenix"
)

如您所见,测试上下文在中途被保存,主上下文突然有来自测试上下文的新对象,即使我还没有执行整个 NSManagedObjectContextDidSaveNotification/mergeChangesFromContext 组合。

我的理解是,除非明确这样做,否则不会合并任何更改...有人知道这里发生了什么吗?

【问题讨论】:

【参考方案1】:

我的理解是,除非明确这样做,否则不会合并任何更改...

这是不正确的。我猜在您的5) 之后,您在主要上下文中重新获取了Artists,对吧?任何获取总是下到磁盘,访问文件。如果那是在从不同的上下文保存之后,那将获取您刚刚创建的新条目。如有冲突,按照您的mergePolicy处理,见this Apple doc。

【讨论】:

以上是关于为啥在没有明确合并的情况下,更改可能会从一个 NSManagedObjectContext 填充到另一个?的主要内容,如果未能解决你的问题,请参考以下文章

为啥切片函数在不明确使用 dplyr 的情况下不起作用

在没有变基的情况下恢复合并

如何在没有实际合并的情况下测试合并

在没有 SVN 客户端的情况下应用 TortoiseSVN 补丁

如何在没有合并提交或使用 CLI 的情况下使 GitHub 分叉保持最新?

如何在不合并先前分支的更改的情况下合并分支