NSFetchedResultsController 看不到扩展所做的插入
NSFetchedResultsController not seeing inserts made by extension
我有一个 iOS 应用程序结构如下
- 主应用程序(主要 iOS 应用程序)
- Intents 扩展(Siri 集成)
- Shared Framework(用于与 Core Data 交互的共享库。这允许主应用程序和 intents 扩展使用相同的 Core Data 存储)
我的问题是,当我使用 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
将相应更新。
我有一个 iOS 应用程序结构如下
- 主应用程序(主要 iOS 应用程序)
- Intents 扩展(Siri 集成)
- Shared Framework(用于与 Core Data 交互的共享库。这允许主应用程序和 intents 扩展使用相同的 Core Data 存储)
我的问题是,当我使用 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
将相应更新。