2009-11-07 55 views
6

我想要做什麼?有沒有在進程間共享Core Data存儲的方法?

  1. 從磁盤上的Core Data存儲中讀取數據的UI進程。它不需要編輯數據,只需讀取並顯示數據。

  2. 一個命令行進程,寫入與UI訪問相同的數據存儲。

爲什麼?

因此,命令行進程可以一直運行,但用戶可以退出UI進程並忘記該應用程序,直到他們需要查看捕獲的數據爲止。

實現此目的的最簡單和最可靠的方法是什麼?

我該怎麼辦?

我已經閱讀過在線程之間共享數據存儲並在此之前實現過一次,但我無法在文檔或Web上找到指示如何在進程之間共享存儲的任何內容。

就像在同一個數據存儲文件中指出兩個進程一樣簡單嗎?我簡單地嘗試了這一點。它似乎工作正常,但我擔心當真正處於壓力下時,我可能會遇到鎖定等問題。

最後

我會很感激有人給我指點與此有關什麼方向走。謝謝。

回答

2

這可能是其中一種情況,您只需嘗試並參見™。

就我所知,SQLite(它是你最想使用的數據存儲)已經內置了文件鎖定等機制;所以文件的完整性可能會得到保證。另一方面,如果您使用CoreData/XML方法,則可能會遇到問題。

換句話說;使用SQLite作爲你的文件的支持,你可能會好起來的。

1

您需要重新考慮您的架構。如果你想要一個守護進程擁有數據存儲,那麼讓你的GUI應用程序連接到守護進程。試圖共享數據存儲是一堆你不想打開的蠕蟲。

+0

這不一定是正確的。只要守護進程中沒有超過每秒寫入操作次數,基於SQLite的持久性Core Data存儲就可以正常工作。 – bbum 2009-11-07 18:18:12

+0

而且由於我每3秒就有12次節省,所以我認爲這比「一個bazillion」少! :) – 2009-11-10 13:07:41

2

您可以按照自己的意願進行操作,您可能希望使用SQLite存儲,否則每次要同步數據時保存並提交都會非常慢。您只需在應用程序之間使用某種IPC門鈴,以便您可以通知其需要重新檢查磁盤上的持久性存儲併合並其數據的一個應用程序。

Multi-Threading with Core Data(位於「通用指南」中,打開2)中使用多個持久存儲驗證者作爲有效選項的Apple文檔。這恰好是在同一個進程中討論完全並行的CD堆棧,但如果它們在完全獨立的地址空間中,它也是有效的。

+0

謝謝。這真的很有幫助。 我假設要在使用NSDistributedNotificationCenter或分佈式對象的進程之間傳遞數據。我傾向於後者。 http://stackoverflow.com/questions/504122/best-practices-for-passing-data-between-processes-in-cocoa – 2009-11-07 12:08:58

+0

當然可以,但如果一切都通過持久存儲你剛纔保存:在一個進程,發送通知,並在另一個應用程序中使持久性堆棧保持最新狀態。結帳http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html#//apple_ref/doc/uid/TP40001803-208900 – 2009-11-07 12:29:32

+0

你可以使用任何分佈式通知,一的kqueue或dispatch_source來監視sqlite存儲文件的修改。只是不要投票。 – bbum 2009-11-07 18:17:16

2

近兩年,我就已經找到了這樣做的更好的方法。

答案似乎在於與同步服務。我甚至沒有意識到它存在!有一個關於這個極好的郵遞:

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

我沒有試圖與我的應用程序還沒有,但似乎共享兩個進程或應用程序之間的核心數據存儲的極佳方式。

如果我遇到任何性能問題,我會相應地更新這個答案,但是這似乎是蘋果推薦這樣做的方式。

+0

SyncServices似乎已被放棄,轉而使用iCloud。 – stevesliva 2014-04-02 04:19:06

+0

這個答案現在需要更新,因爲同步服務在Yosemite中已經被棄用了。此外,引入App Extensions使這個問題變得更加重要(即在主應用程序和擴展之間共享Core Data存儲)。 – adib 2014-11-19 01:32:56

相關問題