有什麼技術原因不能讓單身人士班級來管理我的核心數據?我現在正在努力做出決定,如果我應該刪除所有樣板核心數據代碼並以單身形式重新實現它。核心數據單身經理?
14
A
回答
14
Xcode模板中應用程序委託中的樣板代碼在功能上作爲單例實現。應用程序對象是一個單例,它只維護一個委託對象,因此您只有一個Core Data堆棧實例,並且由於應用程序對象可以通用訪問,所以您始終可以訪問應用程序委託。
但是,即使只適用於具有一個持久存儲的簡單應用程序,並且所有上下文都使用該一個存儲。在更復雜的應用程序中,您可能有多個商店或上下文,因此單身人士很快變得太臃腫。
一個單例通常不會爲你隱藏或保存重複編碼帶來很大的複雜性,因爲大部分與核心數據有關的編碼都在控制器層中,在此模型中將模型鏈接到視圖/接口。由於該邏輯通常是針對每個視圖定製的,因此您無法將其停放在單例中。
我過去使用過單身人士,但最終他們通常會證明比他們身價更麻煩。
15
有兩個重要的考慮因素(注意:這些都不是隻有兩個)決定是否單身是適合你的時候:
- 線程
- 內存使用
線程
單身很方便,但如果你的應用程序使用多線程,你可能會試圖寫是這樣的:
[[CDSingleton managedObjectContext] executeFetchRequest:someFetch];
//later on a background thread you might write
NSManagedObject *object = [[CDSingleton managedObjectContext] objectWithID:objectID];
不久之後,你的應用程序會崩潰,因爲你已經訪問其很可能在主線程中創建一些其他線程managedObjectContext。
內存使用
單身永遠不會消失,這是一個單身的地步。因此,他們也從不願意釋放他們所消耗的資源。就CoreData而言,這意味着託管對象上下文將繼續在內存中保存託管對象,直到您調用-reset或-save :.
如果您的應用使用大量數據,那可能會很糟糕。
2
最佳做法是在視圖控制器之間傳遞託管對象上下文。蘋果的文檔和樣品就是這樣。你永遠不應該真的需要訪問你的應用程序委託,而不是核心數據,而不是任何事情。
http://www.cimgf.com/2011/01/07/passing-around-a-nsmanagedobjectcontext-on-the-iphone/
相關問題
- 1. 單身人士與核心數據
- 2. Asp.net核心身份 - 管理
- 3. 核心數據上下文和單身數據控制器
- 4. 清理出核心數據
- 5. 核心數據庫自身刪除
- 6. 單身經理initWithDelegate
- 7. 單核實體核心數據性能
- 8. Magento「單身/核心/資源」已經存在錯誤
- 9. 核心數據對象的NSArray單身null
- 10. 核心數據:錯誤:異常被發現在覈心數據更改處理
- 11. 核心數據支持的非核心數據數據UITableView
- 12. 使用核心數據與核心圖
- 13. 核心數據和核心位置
- 14. 處理iCloud核心數據錯誤
- 15. Xcode管理「核心數據」記錄
- 16. 核心數據和內容管理器
- 17. 處理核心數據模型更改
- 18. NSUndoManager撤消不處理核心數據
- 19. 撤消核心數據管理對象
- 20. 核心數據 - 管理對象問題
- 21. 核心數據內存管理
- 22. 圖像處理rails + iOS核心數據
- 23. 的iOS - 核心數據 - 完成處理
- 24. 核心數據錯誤處理NSCFBoolean?
- 25. 核心數據錯誤處理
- 26. 處理managedObjectContext的核心數據錯誤
- 27. 核心數據 - 內存管理?
- 28. 理解添加/核心數據
- 29. 使用核心數據撤銷管理
- 30. 核心數據 - 處理動態屬性
你能解釋一下關於線程問題的更多嗎?我正在爲聊天應用使用單身人士,並且在獲取上下文時我的應用崩潰。 – OMGPOP 2014-01-06 16:42:33
如何不能使用單例防止多線程問題?即使您傳遞上下文指針,仍然只有上下文的一個副本 – OMGPOP 2014-01-06 16:46:50
它鼓勵您爲特定線程創建實例。如果你傳遞上下文指針,你創建了一個單例,不管它是否遵循這個模式。 – ImHuntingWabbits 2014-01-06 19:46:48