NSFetchedResultsController 看不到扩展所做的插入

NSFetchedResultsController not seeing inserts made by extension

我有一个 iOS 应用程序结构如下

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

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

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


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

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

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

  • NSPersistentStoreRemoteChangeNotification
  • UserDefaults(套件名称:)
  • 达尔文通知

我正在为 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
    }

要在应用程序和扩展程序之间共享数据库,您需要实施持久历史记录跟踪。有关介绍,请参阅 WWDC 2017 What's New in Core Data at 20:49 and for sample code see the documentation Consuming Relevant Store Changes

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