2013-04-12 38 views
0

我原本以爲我的問題的答案是一個簡單的'是',但是自從我做了一些閱讀之後,我又一次看到了這個問題。我可以在應用程序中有多個獨立的CoreData堆棧嗎?

我的意圖是使用模塊化代碼,它允許我從多個代碼段中進行選擇以嚮應用程序添加各種功能。舉個例子,我可能有一個允許安全瀏覽的瀏覽器組件,一個調查組件來接受用戶調查,還有一個「核心」組件是應用程序的主要用途 - 無論是顯示菜單還是顯示地圖的位置。

我想讓每個獨立模塊擁有自己的CoreData堆棧。除了應用程序本身介導的任何內容(使用委託模型完成的應用程序通信)之外,它們不以任何方式彼此對話或互相干擾。瀏覽器的書籤列表和白名單網站與調查的調查數據列表不同,它與應用程序的「核心」功能完全分離。如果他們需要彼此交談,他們可以通過委託調用來實現,這包括告訴應用程序'我需要一個瀏覽器來顯示X頁面','用這個ID顯示調查',或者最後是「我是完成後,返回到主應用程序「。

我開始意識到沒有辦法確定給定的NSManagedObjectContextDidSaveNotification是否屬於給定的核心數據堆棧。並且,可能的是,在mergeChangesFromContextDidSaveNotification:方法中向MOC提供來自不同核心數據堆棧的通知將是一個壞主意。 (我還擔心當您嘗試喂MOC自己的通知回它會發生什麼,但是這件事情我可以很輕鬆地實驗)

回答

4

你可以(而且這是的NSManagedObjectContext文檔中明確建議) 寄存器從具體的上下文來變化:

[[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(<#Selector name#>) 
           name:NSManagedObjectContextDidSaveNotification 
          object:<#A managed object context#>]; 

,當你收到這樣的通知,該通知的對象是被管理的對象上下文。因此可以創建獨立的組件,其中每個組件使用其自己的核心數據堆棧。

1

正如Martin R指出的那樣,您可以註冊來自特定環境的通知。如果您正在偵聽來自多個上下文的通知,還可以通知通知哪個上下文發佈了該通知並基於此通知進行通知。用NSManagedObjectContextDidSaveNotification,看看[notification object]找出發佈它的上下文。

將對象保存在完全不同的堆棧中,並使用單獨的持久性存儲區,似乎過多,除非存在某種安全相關問題。就像也許,出於某種原因,一個數據集合永遠不會被允許靠近某些其他集合是非常重要的。如上所述,該應用似乎沒有任何額外複雜性的令人信服的理由。

您可能會發現最好使用一個堆棧和一個持久性存儲,但使用多個配置。每個配置都會包含來自數據模型的特定實體。您將擁有一個持久性存儲和一個NSManagedObjectModel實例,但有多個NSPersistentStoreCoordinator實例。在撥打addPersistentStoreWithType:configuration:URL:options:error:時指出您需要哪種配置。

+0

單獨堆棧的目的是爲了避免額外的工作,試圖手動合併每個應用程序的模型 - 它還允許我相對容易地更新模塊的模型,因爲我可以在一個地方更改它們讓git Submodules處理拉動變化。我將不得不通過配置來閱讀。 – RonLugge

相關問題