我创建了两个这样的上下文:
// create writer MOC
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateWriterContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
// create main thread MOC
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.parentContext = _privateWriterContext;
我有一个NSFetchResultedController
发起于_managedObjectContext
.
我知道这很奇怪,但我正在向父级添加一条记录_privateWriterContext
, I am saving
it.
令人惊讶的是儿童背景等等FRC
收到有关此事件的通知。为什么?我没有reset
-ed 孩子,或其他任何东西。我认为只要子上下文不会被保存,它们就是独立的实体。
在 @pteofil 文章中我发现了这一行:
当在上下文中进行更改但未保存时,它对其所有后代可见,但对其祖先不可见。
..它被推送到持久存储(通过持久存储协调器),并且对连接到该存储的所有上下文都可见。
这是不应该发生的。添加一个 NSManagedObject ('record' ) 到parentContext,不会让子进程自动知道这个对象。只有当你让childContext执行fetch时,它才会从parentContext中获取。
为了弄清楚您的情况发生了什么,这里有一些建议:
- 弄清楚何时在 childContext 上执行提取(这是在设置时由 fetchedRestultsController 完成的。检查该提取是在将 ManagedObject 添加到 ParentContext 之前还是之后发生)。
- 在 fetchedResultsController 的所有四个委托回调中设置断点,以找出它正在为哪个对象调用方法(并查看它是否是您刚刚添加到 ParentContext 的对象)。
- 绝对确保您也知道您正在发送消息的上下文。
我使用了类似的方法,但有所不同:childContext 是用于解析新数据(在私有队列上)的上下文,当解析完成时,chid 调用 save:。这会将更改保存到父级,在我的例子中是 mainQueueContext。对 save: 的调用将导致 mainQueueContext 接收所有新解析的对象,并且使用该 mainQueueContext 的任何 fetchedResultsController 然后将调用其新/更改/更新/删除对象的委托方法。
您也可以尝试颠倒您的孩子/父母关系,看看它是否按照文档中所述工作,只是为了找出发生了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)