CoreData:带有子主上下文的私有上下文 - FetchedResultsController 未获得更新

Posted

技术标签:

【中文标题】CoreData:带有子主上下文的私有上下文 - FetchedResultsController 未获得更新【英文标题】:CoreData: Private context with child Main context - FetchedResultsController not getting updates 【发布时间】:2015-07-30 11:08:02 【问题描述】:

我一直在尝试按照Marcus Zarra 的描述构建一个核心数据堆栈,其中他有一个私有队列上下文和一个主队列上下文(其中主队列上下文是私有队列上下文的子级)。

我相信我已经在 Swift 中忠实地重建了 (here) 他所描述的 MCPersistenceController(示例代码是 Obj-C)。

问题在于我的ListViewModel class(其中包含NSFetchedResultsController)。无论我尝试什么,当插入新的 Item 对象时,它的委托回调(controllerDidChangeContent 等)都不会被调用。

FRC 和 NSFetchRequest 使用主上下文;该项目被插入到主要上下文中; save function 保存主上下文,然后将更改合并到私有队列中

如果我在插入和保存后对任一上下文执行手动 executeFetchRequest,我确实会返回新创建的 Item

如果我监听NSManagedObjectContextObjectsDidChangeNotification 通知,它们确实在插入后被触发。

当我重新启动应用程序时,我插入的Items 现在会显示出来。

我只能假设在错误的线程上做某事并且没有报告错误是一个问题,但无论我尝试了什么,当我插入一个新的Item 时,FRC 不会触发委托回调。可能是我错过了一些 Swift 的东西。

现在我真的很感谢任何建议 ????。

我的简单概念验证项目 (Swift 1.2) 位于 GitHub。 (我还没有接触到 CloudKit 的东西..)。

【问题讨论】:

【参考方案1】:

您的 ListViewModel 对象是一个纯 Swift 对象。获取的结果控制器使用 NSObject-descended 功能来检查委托是否响应委托方法。

@objc
class ListViewModel: NSFetchedResultsControllerDelegate

修复它。

【讨论】:

就是这样!太棒了,谢谢 - 上帝知道我需要多长时间才能找到它。

以上是关于CoreData:带有子主上下文的私有上下文 - FetchedResultsController 未获得更新的主要内容,如果未能解决你的问题,请参考以下文章

多线程 CoreData 应用程序中主上下文和私有上下文的推荐合并策略

NSManagedObjectContext 从私有上下文合并,只刷新改变的对象

将主上下文和私有上下文与 Core Data 合并

CoreData:带有privateQueueConcurrencyType的backgroundContext和子上下文之间的区别?

CoreData 多线程

CoreData从后台线程读取数据仍然阻塞UI界面的原因及解决