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
获取更改,然后使用mergeChangesFromContextDidSaveNotification
和transaction.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 看不到扩展所做的插入的主要内容,如果未能解决你的问题,请参考以下文章