为什么可能会在没有显式合并的情况下从一个NSManagedObjectContext填充更改到另一个NSManagedObjectContext?

时间:2010-03-18 19:57:27

标签: objective-c cocoa-touch core-data nsmanagedobjectcontext

我正在使用一个使用多个线程/ 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 个答案:

答案 0 :(得分:1)

  

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

这不正确。我想在你5)之后,你在主要背景下反映了Artists,对吗?任何提取总是下载到磁盘,访问该文件。如果那是在从不同的上下文保存之后,那将获取刚刚创建的新条目。如果存在冲突,则会根据您的mergePolicy处理这些冲突,请参阅this Apple doc