我的问题有点类似于How to have multiple apps - one Core Data?。但我无法按照答案中的建议进行复制。
我有两个申请。一个应用程序(第一个应用程序)允许用户执行所有类型的操作并保存在coredata中。
其他应用程序(第2个应用程序)是服务应用程序。在这里,我希望每次更新coredata时都会通知服务(任何更改,如创建,删除,更新完成)。
如果我在第二个应用程序中使用以下通知,则不会触发此通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(modelUpdated)
name:NSManagedObjectContextDidSaveNotification
object:nil];
如果我有基于UI的应用程序甚至是后台应用程序,那么我可以使用NSDistributedNotification
。
但我想要比分布式通知更好的东西。
请给我一些提示,以便我可以继续前进。
注意:此应用不会通过AppStore,因此不会考虑沙盒。
答案 0 :(得分:0)
如果您打算自行分发您的应用程序,您几乎可以做任何想做的事情。
您当然可以将每个应用程序中的PSC附加到同一个SQLite文件中。没问题。
至于知道文件何时被修改,您可以使用kqueue或dispatch_source来监视文件何时更改。但是,只要知道它已经改变就不会告诉你 已经改变了,这意味着你的观察者进程需要重新获取以更新其MOC。
如果这已足够,那么这可能是最简单的选择。
如果您需要更精细的通知,那么无需向任何感兴趣的各方通知商店中的具体更改。你可以自己动手,使用XPC,或者只使用NSDistributedNotification
(记住后者既不安全也不保证)。
您应该做的是在直接连接到PSC的任何MOC上观察NSManagedObjectContextDidSaveNotification
。在该处理程序中,您将创建一个类似于您收到的通知。除此之外,您应该只在URI表示中发送对象ID集。
现在,您的观察者可以获得有关插入,更新和删除对象的详细信息。
同样,如果您不想完成所有这些操作,您可以使用传统的操作系统机制来观察文件已更改,并且只需重新获取。如果你选择这条路线,你可以做一件事来帮助...保持一个"最后一次修改"每个对象的日期,以及该属性的索引。然后,您至少可以查询自上次加载数据库以来已更改的对象。这里还有很多其他的选择......基本的想法是,如果你通过操作系统进行监控,你只会被告知事情发生了变化......你必须弄明白......如果重要的话。
对于沙盒应用程序,可用的少数解决方案之一是通过XPC启动的守护程序共享数据。
修改强>
distributedNotification我不想使用,实际上这不会起作用 对于deomon /服务应用程序。你的另一点MOCDidSaveNoti不是 观察到了。我在发布这个问题之前尝试了两个。 - Anoop 维迪
当然NSManagedObjectContextDidSaveNotification
不会告诉你在另一个过程中发生了什么变化。它不知道改变了什么,也不知道其他过程中的MOC。对不起,我写的很差,让你觉得它会。
在更改数据存储的任何MOC中都要遵守该通知,其唯一目的是将该信息传播到其他进程。然后,通知处理程序应该发送一个远程通知(无论你想要做什么...... SHM,管道,消息队列,XPC,烟雾信号等),以及所有已更改对象的对象ID。
任何想要了解已更改数据存储的进程都需要监视远程通知(无论您选择发送它)。
你想做什么并不重要......你受限于可用的东西。
您有两个基本选择:
观察商店已更改的一般更改通知(kqueue,dispatch_source等)。但是,您所知道的是商店已更改,这意味着您必须执行完整的重新提取。
保存商店时发送远程通知,传递已更改内容的对象ID,并让其他进程监视该远程通知并相应地更新其MOC。