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(),则必须设置automaticallyMergesChangesFromParent为true.
我同意文档在这一点上令人困惑,"......并自动使用来自其他上下文的保存通知."
自动将父需求的更改合并到viewContext上,如下所示:
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
Run Code Online (Sandbox Code Playgroud)
我没有直接遇到这个问题,但是如果newBackgroundContext实际上是在viewContext下分层的,你的问题让我感到奇怪,因为来自新上下文的任何保存只会更新viewContext,而viewContext也必须自己保存以获取对持久性存储的更改(您说正确发生).基于这种怀疑,我查看了Apple所说的开发人员文档:
调用此方法(newBackgroundContext())会导致持久容器创建并返回一个新的NSManagedObjectContext,并将concurrencyType设置为privateQueueConcurrencyType.此新上下文将直接与NSPersistentStoreCoordinator关联,并设置为自动使用NSManagedObjectContextDidSave广播.
因此,它不会与viewContext处于父子关系中.根据指导,似乎新的上下文会被旧的通知更改,反之亦然,因此当新的上下文发生更改时,您必须对viewContext进行刷新,如果可以的话,可以通过编程方式执行跟踪代码中的内容,或者使用NSManagedObjectsContext中的某个更改通知来触发操作.
| 归档时间: |
|
| 查看次数: |
4806 次 |
| 最近记录: |