核心数据iOS10:viewContext没有使用NSFetchResultController从newBackgroundContext()接收更新

alp*_*nec 30 core-data nsfetchedresultscontroller nsmanagedobjectcontext ios ios10

在我的应用程序中,我有一个NSFetchedResultsController在UITableView中加载Core Data对象.与此FRC关联的获取请求使用viewContext可用于NSPersistentContainer(iOS10)的新属性.

当我选择一个单元格时,我将Core Data对象传递给一个新的ViewController.这个新的VC仍然使用viewContext.从这个ViewController,我可以从模态呈现的ViewControllers更新Core Data对象.为此,我使用newBackgroundContext()模态ViewControllers.我可以毫无问题地保存更新Core Data对象.

问题是FRC不会使用后台上下文中的更新Core Data对象自动更新.就好像viewContext没有被接收并处理Core Data对象更新一样.

如果我automaticallyMergesChangesFromParent为viewContext(app wide)设置为true,则FRC在保存背景上下文时获取更新的Core Data对象.根据我的理解,viewContext应该自动管理数据的合并.该文档描述了viewContext:"此上下文配置为生成并自动使用来自其他上下文的保存通知."

你能说明如何使用NSFetchResultController处理不同的上下文吗?

Jer*_*rry 32

你看到了正确的行为.如果您希望viewContext自动从其他上下文中获取更改,包括由其创建的更改newBackgroundContext(),则必须设置automaticallyMergesChangesFromParenttrue.

我同意文档在这一点上令人困惑,"......并自动使用来自其他上下文的保存通知."

  • 为我工作,只需确保将设置应用于父viewContext。 (2认同)

Ram*_*mis 8

自动将父需求的更改合并到viewContext上,如下所示:

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
Run Code Online (Sandbox Code Playgroud)


Ron*_*iel 7

我没有直接遇到这个问题,但是如果newBackgroundContext实际上是在viewContext下分层的,你的问题让我感到奇怪,因为来自新上下文的任何保存只会更新viewContext,而viewContext也必须自己保存以获取对持久性存储的更改(您说正确发生).基于这种怀疑,我查看了Apple所说的开发人员文档:

调用此方法(newBackgroundContext())会导致持久容器创建并返回一个新的NSManagedObjectContext,并将concurrencyType设置为privateQueueConcurrencyType.此新上下文将直接NSPersistentStoreCoordinator关联,并设置为自动使用NSManagedObjectContextDidSave广播.

因此,它不会与viewContext处于父子关系中.根据指导,似乎新的上下文会被旧的通知更改,反之亦然,因此当新的上下文发生更改时,您必须对viewContext进行刷新,如果可以的话,可以通过编程方式执行跟踪代码中的内容,或者使用NSManagedObjectsContext中的某个更改通知来触发操作.

  • .automaticallyMergesChangesFromParent的文档(在NSManagedObjectContext.h中)说:"上下文是否自动合并保存到其协调器或父上下文的更改.不支持将上下文固定到非当前查询生成时将此属性设置为YES".所以看起来"商店协调员"涵盖了没有父母的情况..viewCoordinator和.newBackgroundContext共享同一个商店协调员(我刚检查过它).因此,设置.automaticallyMergesChangesFromParent将导致预期的行为. (3认同)