2010-07-26 52 views
6

我在我最新的iPhone應用程序中使用CoreData。 我在開始時發現它很複雜,但我想這是您需要將對象存儲在iPhone應用程序中的最佳選擇(http://inessential.com/2010/02/26/on_switching_away_from_core_data)。CoreData最佳實踐

在iPhone應用程序使用CoreData時是否有任何的最佳做法? 例如,我不希望所有控制器都處理您希望發出請求時需要的NSManagedObjectContext。 您是否爲CoreData請求定義了一個類?

+0

感謝BoltClock,我不知道這個功能! – 2010-07-26 14:24:39

+0

可能的重複[在哪裏放置「核心數據堆棧」在Cocoa/Cocoa Touch應用程序中](http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in -a-可可可可觸摸應用程序) – 2010-07-26 15:19:20

回答

6

我通常會創建一個專用的對象來管理我的核心數據堆棧和相關對象和行爲。這很有用,因爲有很多帶有Core Data的鍋爐板,所以我可以製作一個通用的基礎管理器類,然後爲每個應用程序使用一個子類。我通常稱它爲AppNameDataModel。

我更喜歡隱藏DataModel對象內的託管對象上下文。這會強制應用程序中的其他對象要求DataModel對象訪問核心數據堆棧,以提供良好的封裝和安全性。

通常情況下,我在創建數據模型類方法來爲實體,例如,返回取

-(NSFetchRequest *) entityNameFetch; 

...然後在數據模型一個performFetch方法。在使用中,控制器要求實體獲取,配置提取,然後要求DataModel執行提取並返回結果。您可以編寫生成返回提取方法的代碼,並且執行提取也是鍋爐板。這樣可以節省大量時間,特別是在原型製作時。

對DataModel實例本身的引用可以從控制器傳遞到控制器,但我認爲這是單例模式的有效用法,所以我經常使DataModel成爲單例,並在UIViewController上提供一個類別以供屬性訪問。這意味着我添加到項目中的任何視圖控制器都可以自動訪問DataModel。

這種模式保持一切很好的封裝和模塊化。它可以輕鬆地添加新視圖或在項目之間共享數據模型。初始設置需要一些工作,但一旦擁有基礎級別,未來的使用將大大加速。

1

感謝布拉德用於指向這個問題。

作爲mentionned蘋果文檔[1]中,上下文必須被傳遞到需要CoreData每個新的視圖控制器。

在iPhone:

按照慣例,通常可以得到一個視圖控制器的上下文。這取決於你,但要遵循這種模式。 當您實現與Core Data集成的視圖控制器時,您可以添加NSManagedObjectContext屬性。

視圖控制器通常不應該檢索來自全局對象的上下文,如應用程序的代理。這往往會使應用程序架構變得僵化。視圖控制器通常不會爲其自己的使用創建上下文。這可能意味着使用控制器上下文執行的操作不會註冊到其他上下文中,因此不同的視圖控制器將對數據有不同的觀點。

當你創建一個視圖控制器,你傳遞給它的上下文。您傳遞一個現有上下文,或者(在您希望新控制器管理一組離散編輯的情況下)創建一個新的上下文。通常,應用程序委託負責創建一個上下文以傳遞到顯示的第一個視圖控制器。

[1] - http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283