NSFetchedResultsController 看不到扩展所做的插入

Posted

技术标签:

【中文标题】NSFetchedResultsController 看不到扩展所做的插入【英文标题】:NSFetchedResultsController not seeing inserts made by extension 【发布时间】:2020-06-27 21:24:28 【问题描述】:

我有一个这样的 ios 应用程序

主应用程序(iOS 主应用程序) Intents 扩展(Siri 集成) 共享框架(用于与 Core Data 交互的共享库。这允许主应用程序和意图扩展使用相同的 Core Data 存储)

我的问题是,当我使用 Intents Extension 将某些内容插入 Core Data 时,它不会出现在 Main Application 的 UITableView 中,直到我手动刷新fetchedResultsController 像这样:

NSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: "myCache")
try? fetchedResultsController.performFetch()
tableView.reloadData()

有没有办法让 fetchedResultsController 看到更改而无需手动刷新所有内容?


注意:如果我从主应用程序向核心数据中插入一些内容,fetchedResultsController 会自动看到更改并更新表(如预期的那样)

【问题讨论】:

【参考方案1】:

要在应用和扩展程序之间共享数据库,您需要实现持久历史跟踪。简介见WWDC 2017 What's New in Core Data 20:49,示例代码见文档Consuming Relevant Store Changes。

基本思想是启用存储选项NSPersistentHistoryTrackingKey,观察NSPersistentStoreRemoteChangeNotification,在收到通知后,您应该使用NSPersistentHistoryChangeRequest 获取更改,然后使用mergeChangesFromContextDidSaveNotificationtransaction.objectIDNotification 合并到上下文中。然后您的NSFetchedResultsController 将相应更新。

【讨论】:

【参考方案2】:

这是正常的,因为应用程序扩展和主应用程序不在同一个进程中工作。

有一些方法可以更新主应用程序中的数据

NSPersistentStoreRemoteChangeNotification 用户默认值(套件名称:) 达尔文通知

我正在为 viewContext 使用 UserDefaults 和 refreshAllObjects 函数。

例子:

func sceneDidBecomeActive(_ scene: UIScene) 
    let defaults = UserDefaults(suiteName:"your app group name")

    let hasChange = defaults?.bool(forKey: "changes")
    if hasChange ?? false 
        refreshAllObjects()
        defaults?.set(false, forKey: "changes")
    
    

刷新所有对象功能是这样的:

   viewContext.perform 
        viewContext.stalenessInterval = 0.0
        viewContext.refreshAllObjects()
        viewContext.stalenessInterval = -1
    

【讨论】:

以上是关于NSFetchedResultsController 看不到扩展所做的插入的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?