Objective c 是否有一种在进程之间共享核心数据存储的方法?

Objective c 是否有一种在进程之间共享核心数据存储的方法?,objective-c,cocoa,core-data,process,Objective C,Cocoa,Core Data,Process,我想做什么? 从磁盘上的核心数据存储中读取数据的UI进程。它不需要编辑数据,只需读取和显示数据 一种命令行进程,它写入用户界面访问的同一数据存储 为什么? 因此,命令行进程可以一直运行,但用户可以退出UI进程并忘记应用程序,直到他们需要查看捕获的数据 实现这一点最简单、最可靠的方法是什么 我试过什么? 我之前读过关于在线程之间共享数据存储的内容,并实现过一次,但在文档或web上找不到任何说明如何在进程之间共享存储的内容 它是否像将两个进程指向同一个数据存储文件一样简单?我已经对此做了简单的实验。

我想做什么?

  • 从磁盘上的核心数据存储中读取数据的UI进程。它不需要编辑数据,只需读取和显示数据

  • 一种命令行进程,它写入用户界面访问的同一数据存储

  • 为什么?

    因此,命令行进程可以一直运行,但用户可以退出UI进程并忘记应用程序,直到他们需要查看捕获的数据

    实现这一点最简单、最可靠的方法是什么

    我试过什么?

    我之前读过关于在线程之间共享数据存储的内容,并实现过一次,但在文档或web上找不到任何说明如何在进程之间共享存储的内容

    它是否像将两个进程指向同一个数据存储文件一样简单?我已经对此做了简单的实验。它似乎工作正常,但我担心当它真的处于压力之下时,我可能会遇到锁定等问题

    最后


    我真的很感激有人给我指点,告诉我该怎么做。谢谢。

    这可能是其中一种情况,在这种情况下,您只需尝试一下即可™.

    就我所记得的,SQLite(这是您最想使用的数据存储)内置了文件锁定等机制;因此,文件的完整性很可能得到保证。另一方面,如果使用CoreData/XML方法,则可能会遇到问题


    换言之;对文件使用SQLite备份,您应该不会有问题。

    您需要重新考虑您的体系结构。如果您希望守护进程拥有数据存储,那么让您的GUI应用程序连接到该守护进程。试图共享数据存储区是一堆你不想打开的蠕虫。

    你可以做你想做的事情,你可能想使用SQLite存储区,否则每次你想同步数据时保存和提交都会非常慢。您只需要在应用程序之间使用某种IPC门铃,这样您就可以通知一个应用程序它需要重新检查磁盘上的持久存储并合并其数据


    在中使用多个持久存储corindators作为有效选项的Apple文档(在“一般指南”中,打开2)。这恰好是在同一个过程中讨论完全并行的CD堆栈,但如果它们也在完全独立的地址空间中,这是有效的。

    近两年过去了,我刚刚找到了一种更好的方法

    答案似乎在于同步服务。我甚至没有意识到它的存在!关于这一点,有一个很好的帖子:

    我还没有在我的应用程序中尝试过这一点,但这似乎是在两个进程或应用程序之间共享核心数据存储的一种很好的方式


    如果我遇到任何性能问题,我会相应地更新此答案,但这似乎是苹果推荐的解决方法。

    谢谢。那真的很有帮助。我假设使用NSDistributedNotificationCenter或分布式对象在进程之间传递数据。我倾向于后者。当然可以,但如果所有内容都通过了持久性存储,您只需保存:在一个进程中,发送通知,在另一个应用程序中,更新持久性堆栈。签出您可以使用分布式通知、kqueue或dispatch_源来监视sqlite存储文件的修改。只是不要投票。@Louis很棒。谢谢你的链接。这正是我想做的@B嗯,太好了。谢谢你的额外建议。这似乎是现在讨论这个问题的部分:这不一定是真的。只要守护进程每秒不进行大量写入操作,基于SQLite的持久化核心数据存储就可以正常工作。而且,由于我每3秒就有12次保存,我认为这比“大量”还少SyncServices似乎已经被iCloud取代了。这个答案需要更新,因为SyncServices和优胜美地的SyncServices一样不受欢迎。此外,应用程序扩展的引入使得这个问题更加重要(即在主应用程序和扩展程序之间共享核心数据存储)。