2011-06-13 24 views
14

有什麼技術原因不能讓單身人士班級來管理我的核心數據?我現在正在努力做出決定,如果我應該刪除所有樣板核心數據代碼並以單身形式重新實現它。核心數據單身經理?

回答

14

Xcode模板中應用程序委託中的樣板代碼在功能上作爲單例實現。應用程序對象是一個單例,它只維護一個委託對象,因此您只有一個Core Data堆棧實例,並且由於應用程序對象可以通用訪問,所以您始終可以訪問應用程序委託。

但是,即使只適用於具有一個持久存儲的簡單應用程序,並且所有上下文都使用該一個存儲。在更復雜的應用程序中,您可能有多個商店或上下文,因此單身人士很快變得太臃腫。

一個單例通常不會爲你隱藏或保存重複編碼帶來很大的複雜性,因爲大部分與核心數據有關的編碼都在控制器層中,在此模型中將模型鏈接到視圖/接口。由於該邏輯通常是針對每個視圖定製的,因此您無法將其停放在單例中。

我過去使用過單身人士,但最終他們通常會證明比他們身價更麻煩。

15

有兩個重要的考慮因素(注意:這些都不是隻有兩個)決定是否單身是適合你的時候:

  1. 線程
  2. 內存使用

線程

單身很方便,但如果你的應用程序使用多線程,你可能會試圖寫是這樣的:

[[CDSingleton managedObjectContext] executeFetchRequest:someFetch]; 
//later on a background thread you might write 
NSManagedObject *object = [[CDSingleton managedObjectContext] objectWithID:objectID]; 

不久之後,你的應用程序會崩潰,因爲你已經訪問其很可能在主線程中創建一些其他線程managedObjectContext。

內存使用

單身永遠不會消失,這是一個單身的地步。因此,他們也從不願意釋放他們所消耗的資源。就CoreData而言,這意味着託管對象上下文將繼續在內存中保存託管對象,直到您調用-reset或-save :.

如果您的應用使用大量數據,那可能會很糟糕。

+0

你能解釋一下關於線程問題的更多嗎?我正在爲聊天應用使用單身人士,並且在獲取上下文時我的應用崩潰。 – OMGPOP 2014-01-06 16:42:33

+0

如何不能使用單例防止多線程問題?即使您傳遞上下文指針,仍然只有上下文的一個副本 – OMGPOP 2014-01-06 16:46:50

+0

它鼓勵您爲特定線程創建實例。如果你傳遞上下文指針,你創建了一個單例,不管它是否遵循這個模式。 – ImHuntingWabbits 2014-01-06 19:46:48