【问题标题】:Is there a way of sharing a Core Data store between processes?有没有办法在进程之间共享核心数据存储?
【发布时间】:2010-12-14 02:10:44
【问题描述】:

我想做什么?

  1. 从磁盘上的 Core Data 存储读取数据的 UI 进程。它不需要编辑数据,只需读取和显示数据。

  2. 写入与 UI 访问的数据存储相同的命令行进程。

为什么?

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

实现这一目标的最简单和最可靠的方法是什么?

我尝试了什么?

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

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

终于

我真的很感激有人给我指点这个方向。谢谢。

【问题讨论】:

    标签: objective-c cocoa core-data process


    【解决方案1】:

    这可能是您只需要 Try It And See™ 的情况之一。

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

    换句话说;为您的文件使用 SQLite 支持,您应该没问题。

    【讨论】:

      【解决方案2】:

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

      在Multi-Threading with Core Data 中使用多个持久存储关联符作为有效选项的Apple 文档(在“一般准则”中,打开2)。这恰好是在同一进程中讨论完全并行的 CD 堆栈,但如果它们也在完全独立的地址空间中也是有效的。

      【讨论】:

      【解决方案3】:

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

      答案似乎在于同步服务。我什至没有意识到它的存在!有一篇关于此的精彩帖子:

      http://www.timisted.net/blog/archive/core-data-and-sync-services/

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

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

      【讨论】:

      • SyncServices 似乎已被 iCloud 抛弃。
      • 这个答案需要更新,因为从优胜美地开始,同步服务几乎已被弃用。此外,应用扩展的引入使这个问题变得更加重要(即在主应用和扩展之间共享核心数据存储)。
      【解决方案4】:

      您需要重新考虑您的架构。如果您希望守护程序拥有数据存储,则让您的 GUI 应用程序连接到该守护程序。尝试共享数据存储是一罐您不想打开的蠕虫。

      【讨论】:

      • 这不一定是真的。只要守护进程没有每秒无数次的写入操作,基于 SQLite 的持久核心数据存储就可以正常工作。
      • 而且由于我每 3 秒有 12 次保存,我认为这还不到“亿万”! :)
      猜你喜欢
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多