【问题标题】:NSFetchedResultsController not seeing inserts made by extensionNSFetchedResultsController 看不到扩展所做的插入
【发布时间】: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 会自动看到更改并更新表(如预期的那样)

【问题讨论】:

    标签: ios swift core-data nsfetchedresultscontroller


    【解决方案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
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-27
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2016-12-18
        相关资源
        最近更新 更多