// 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,我保存它.
令人惊讶的是,儿童上下文,所以FRC收到关于这个事件的通知.为什么?我还没有重置孩子,或其他任何东西.只要孩子的上下文不能得到保存,我认为他们是独立的实体.
在@pteofil文章中我发现了这一行:
When a change is made in a context,but not saved,it is visible to all of its’ descendants but not to its’ ancestors.
.. it is pushed to the persistent store (via the persistent store coordinator) and becomes visible to all contexts connected to the store.
解决方法
要弄清楚你的情况发生了什么,这里有一些建议:
找出对childContext执行撷取时(这是通过fetchedRestultsController完成的).在检查parentContext之前或之后,检查该撷取是否发生.
>在fetchedResultsController的所有四个委托回调中设置断点,以找出它正在调用哪个对象(并查看它是否是刚添加到parentContext的对象).
确保你知道你发送邮件的哪个上下文.
我有一个使用类似的方法,但不同的是:childContext是上下文用于解析新数据(在私有队列中),当这个解析完成时,chid调用save:.这将保存更改为父级,这在我的情况下是mainQueueContext.此调用save:将导致mainQueueContext接收所有新解析的对象,并且任何使用该mainQueueContext的fetchedResultsController将会调用它们的新/更改/更新/删除对象的委托方法.您可以尝试反转您的孩子/父母关系,并查看文档中是否按照文档中所述进行操作,以便了解发生的情况.