2011-08-09 29 views
7

我有一個相當複雜的iPhone應用程序,它依靠API從服務器獲取數據並將其顯示給用戶。我有大約5個用於整個應用程序的模型類 - 它們只是擴展NSObject。使用現有(普通)機型將核心數據添加到iPhone應用程序

我想添加一些持久性的模型,以允許應用程序的某些部分即使設備脫機使用 - 它確實基本上只是美化緩存。我只希望我的模型的某些實例能夠被持久化 - 例如,用戶已加入書籤的項目 - 而其他項目不應該,例如數百個搜索結果。

核心數據是否是正確的解決方案?我可以看到的困難是:

  • 我將不得不改變我在整個項目中實例化我的模型對象的方式。我必須將它們初始化爲上下文的一部分,如果它們實際上來自外部API,則這並不一定有意義。
  • 我需要小心,不要堅持我不想要的實例。這似乎歸結爲要麼刪除它的創建後立即被管理對象(真彆扭),或使用一個單獨的,非持續性方面,因爲我不想堅持實例(更好,但仍然有點尷尬)

我希望能夠在整個應用程序中繼續使用我的模型,而無需更改不需要關心持久性的代碼,但根據我的要求,這似乎不可行。另一種方法是與我的現有對象並行設置一組新的託管對象,並僅使用託管對象來實現持久性 - 但這種重複從未像是正確的解決方案。

我應該試着將核心數據放在這裏嗎?如果是的話,該怎麼做?或者我應該只看其他選項 - sqlite3(對於我需要的似乎有點複雜),用戶默認值(可能不是他們想要的),甚至序列化並將我自己的對象寫入文件(似乎是hack-ish )。

感謝您的任何意見!

回答

3

爲什麼不看看NSKeyedArciver/Unarchiver?我會說Core Data是與sqlite數據庫一起處理大量數據的明顯解決方案,但NSKeyedArchiver是我用來保存模型的。 查看Apple的文檔here。使用NSKeyedArchiver是非常簡單的IMO,你可以隨時隨地存儲任何你需要的東西。

+0

謝謝!不能相信我錯過了NSKeyArchiver。我會給它一個鏡頭 - 這可能正是我需要的。 –

+0

沒問題,很高興提供幫助(: –

1

現在您將數據對象實例化爲NSObject的子類。您可以使用另一個間接級別來選擇是否將對象創建爲ManagedObjectModel的子類,並使用定義用於訪問這些對象信息的接口的協議保持大部分應用程序不變,然後傳遞類型爲id<DataObjectProtocol>的對象。取不到將表示非本地對象。

或者,您可以將所有內容創建爲託管對象,只是不存儲除本地不想保存的數據之外的任何內容。因此,您可以知道是否存在任何對象以及如何獲取它,但是您不會花費太多時間或空間來存儲應保留在雲中的數據。做到這一點的方法是將除模型中的所有鍵都定義爲可選。

我會選擇核心數據,因爲它的靈活性,實用性和優化。這真的值得學習。我不會推薦sqlite3方法,iOS上的前進方向是Core Data。如果您使用某種文件存儲,則應該考慮批量讀取和/或寫入操作,因爲您可能會遇到一些性能問題,例如執行多個小文件操作。

+0

謝謝,一些好主意!我會首先給NSKeyedArchiver一個鏡頭,正如其他評論中所建議的,因爲它看起來很簡單,不應該花一天時間才能插入。我確實有一些性能方面的問題,如果沒有解決,我會回到類似於您的建議的方面。 –

相關問題