Ios 多重';持久存储协调员';打开相同的';商店';don';我看不到彼此的变化

Ios 多重';持久存储协调员';打开相同的';商店';don';我看不到彼此的变化,ios,macos,core-data,Ios,Macos,Core Data,TL;DR:我有两个“持久存储协调员”,他们打开同一个“存储文件”。当一个协调器写入更改时,另一个不知道 在我的基于文档的应用程序中,我需要有多个数据库: 1。文档数据库(每个文档一个) 2。共享数据库(所有文档均可看到) 下面是我如何设置堆栈的: 拥有这样的设置非常好,因为: 文档无法访问其他存储 每个文档都可以访问共享数据库文件 但这里有个问题。假设我打开了两个窗口: 文档窗口 没有文档支持的应用程序窗口。它只是使用NSFetchedResultsController显示“共享数据库”中

TL;DR:我有两个“持久存储协调员”,他们打开同一个“存储文件”。当一个协调器写入更改时,另一个不知道


在我的基于文档的应用程序中,我需要有多个数据库:

1。文档数据库(每个文档一个)

2。共享数据库(所有文档均可看到)

下面是我如何设置堆栈的:

拥有这样的设置非常好,因为:

  • 文档无法访问其他存储
  • 每个文档都可以访问共享数据库文件
  • 但这里有个问题。假设我打开了两个窗口:

  • 文档窗口
  • 没有文档支持的应用程序窗口。它只是使用
    NSFetchedResultsController
    显示“共享数据库”中的内容
  • 现在,当文档编辑“共享数据库”时,更改不会立即在另一个窗口中更新。 我的猜测是,因为这些窗口不共享持久存储协调器,所以它们不知道底层文件何时发生了更改

    解决方案是使用一个“持久存储协调器”。但是,这将导致文档可以访问彼此的存储,这是非常危险的

    这个问题有什么解决办法吗


    编辑 我提出了一种解决方案,可以简单地观察文档上下文执行的“did save”通知并合并更改。 这是正确的方法吗

    NotificationCenter.default.addObserver(forName: .NSManagedObjectContextDidSave,
                                           object: nil,
                                           queue: .main) { (notification) in
    
        guard let context = notification.object as? NSManagedObjectContext else { return }
    
        guard context.persistentStoreCoordinator != nil else { return }
    
        sharedAppContainer.viewContext.mergeChanges(fromContextDidSave: notification) 
    }