奇怪的父/子NSManagedObjectContext现象

Ján*_*nos 10 core-data nsfetchedresultscontroller nsmanagedobjectcontext ios

我创建了两个这样的上下文:

// create writer MOC
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateWriterContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

// create main thread MOC
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.parentContext = _privateWriterContext;
Run Code Online (Sandbox Code Playgroud)

我有一个NSFetchResultedController发起人_managedObjectContext.

我知道这很奇怪,但我正在向父母添加一条记录_privateWriterContext,我就是saving它.

令人惊讶的是,子上下文因此FRC得到有关此事件的通知.为什么?我没有reset孩子,或其他任何东西.只要子上下文不会被保存,我认为它们是独立的实体.


在@pteofil文章中我找到了这一行:

当在上下文中进行更改但未保存时,它对所有'后代都可见,但对其'祖先不可见.

..它被推送到持久性存储(通过持久性存储协调器),并且对连接到商店的所有上下文都可见.

Jor*_*ide 0

这是不应该发生的。添加一个 NSManagedObject ('record' ) 到parentContext,不会让子进程自动知道这个对象。只有当你让childContext执行fetch时,它才会从parentContext中获取。为了弄清楚您的情况发生了什么,这里有一些建议:

  • 弄清楚何时在 childContext 上执行提取(这是在设置时由 fetchedRestultsController 完成的。检查该提取是在将 ManagedObject 添加到 ParentContext 之前还是之后发生)。
  • 在 fetchedResultsController 的所有四个委托回调中设置断点,以找出它正在为哪个对象调用方法(并查看它是否是您刚刚添加到 ParentContext 的对象)。
  • 绝对确保您也知道您正在发送消息的上下文。

我使用了类似的方法,但有所不同:childContext 是用于解析新数据(在私有队列上)的上下文,当解析完成时,chid 调用 save:。这会将更改保存到父级,在我的例子中是 mainQueueContext。对 save: 的调用将导致 mainQueueContext 接收所有新解析的对象,并且使用该 mainQueueContext 的任何 fetchedResultsController 然后将调用其新/更改/更新/删除对象的委托方法。您也可以尝试颠倒您的孩子/父母关系,看看它是否按照文档中所述工作,只是为了找出发生了什么。