2012-03-29 46 views
0

我的應用程序中只有一個數據庫模型模式,所以恕我直言,NSManagedObjectModel和NSPersistentStoreCoordinator對象可能駐留在主應用程序委託類中,以便從應用程序的其他部分訪問。但是,我想爲我的應用程序的各個部分使用不同的NSManagedObjectContexts對象,因爲我將使用多線程。如何有不同的NSManagedObjectContexts?

從我個人的數據庫經驗來看,我認爲NSManagedObjectContext在某種程度上與數據庫事務的概念相似。因此,爲了避免將不需要的更改從一個應用程序部分提交到另一個應用程序部分,我的應用程序的各個多線程部分具有單獨的上下文對象是合乎邏輯的。當創建新的項目與核心數據啓用,Xcode創建主應用程序委託三種基本方法

- (NSManagedObjectModel *)managedObjectModel{ 

    // reads your database model file and defined entities from defined DataSchema.xcdatamodeld file 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{ 

    // uses already read database model and initializes defined sqlite database file and returns a persistent store coordinator - a pointer to the database 
} 

- (NSManagedObjectContext *)managedObjectContext{ 

    // opens a connection (and transaction) to the database. 
} 

所以,問題是,這是否合理留在主應用程序委託persistentStoreCoordinator和managedObjectModel方法(和訪問它們通過應用程序),但將managedObjectContext方法移動到那些需要私人數據處理的類?

回答

2

您總是會在主線程上運行一個主要的託管對象上下文。

如果您正在另一個線程上進行後臺處理,則可以在後臺線程上創建另一個NSManagedObjectContext,並指向同一個NSPersistentStoreCoordinator。

當您在後臺上下文中保存/刪除/更新時,會觸發您在主線程上偵聽的通知,並將更改合併回主環境中。

就我個人而言,我沒有App Appate中的任何Core Data對象,因爲我不認爲它們屬於那裏。我認爲蘋果在他們的例子中使用了這個例子來簡化這個例子。我通常有一個CoreDataStack對象,可以在需要的地方傳遞。

您可以查看更高級別的Core Data API,例如Magical Record。我剛剛開始使用它,它非常有用,並刪除了許多從Core Data獲得的樣板代碼。它由Marcus Zarra和團隊撰寫,他顯然對Core Data非常瞭解。

在iOS 5中,通過允許ManagedObjectContexts具有父上下文來改進核心數據。所以在你的情況下,你的背景上下文將是父上下文的子節點,顯然它更容易合併回來。儘管如此,我還沒有嘗試過。

+0

謝謝。你能否解釋一下「背景情境是父母情境下的孩子」?這種背景下的親子關係是什麼? AFAIK可以創建上下文作爲事務:插入記錄,更新或刪除它們,然後保存上下文。該事務中的所有更改都已提交,因此修改的數據可從另一個上下文中看到。我爲什麼要在上下文之間建立父子關係,還是我想念一些東西? – Centurion 2012-03-29 18:21:26

+0

你什麼時候開始使用Core Data? iOS 5?如果你只知道iOS 5中的Core Data,那麼你已經有了父子關係。在iOS 5之前,在後臺環境中執行操作有點複雜:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html#//apple_ref/ DOC/UID/TP40003385-SW1 – bandejapaisa 2012-03-29 18:30:45

1

所以,它的邏輯有獨立的情況下我的應用程序的各種 多線程部分,以避免從一個應用程序的一部分到另一個犯不必要的 變化的對象。

有可能有多個上下文,這是一個廣泛使用的做法。

是合理的離開persistentStoreCoordinator和 managedObjectModel方法在主應用程序委託(和訪問這些 通過應用程序),但移動managedObjectContext方法需要專用的數據處理那些 類?

  • 你可以把它留在應用程序委託,通過[[UIApplication sharedApplication] delegate]訪問它。
  • 您可以創建一個單獨的包含核心數據堆棧的單獨類。
  • 你可以傳遞一個指向類之間managedObjectContext的指針。
  • 每個viewController可以通過setParentContext:創建它自己的上下文,將它鏈接到父上下文。

正如你所看到的,這取決於你的項目的複雜性。一般來說,如果您需要進行大量特定的檢索並保存,則可能需要將Core Data堆棧粘貼到它自己的類中。對於較小的項目,爲什麼不把它留在應用程序委託中並通過指針傳遞上下文。

此外,請查看關於核心數據的2011年WWDC會議。它討論了一些很酷的新功能。

相關問題