gpt4 book ai didi

ios - 奇怪的parent/child NSManagedObjectContext现象

转载 作者:技术小花猫 更新时间:2023-10-29 11:08:40 24 4
gpt4 key购买 nike

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

// 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 会收到有关此事件的通知。为什么?我没有reset-ed child 或其他任何东西。我认为只要不保存子上下文,它们就是独立的实体。


在@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.

最佳答案

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

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

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

关于ios - 奇怪的parent/child NSManagedObjectContext现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com