2013-04-14 58 views
5

問題:核心數據VS的NSFileManager

我一直在使用了一段時間,現在我自己的緩存系統使用NSFileManager。通常我收到的數據是JSON,我只是將字典直接保存到緩存中(在文檔文件夾中)。當我需要它時,我會去得到它。我也實現了,有時當我覺得它更好時,根文件夾上的NSDictionary帶有指定資源路徑的鍵/值。例如:

關於日內瓦天氣的資源17/02/2013,所以我將有一個名爲GE_17_02_2013的密鑰和值爲帶有信息的NSDictionary的路徑。

通常我不需要做任何複雜的查詢。但是,不管怎樣,從我一直在閱讀的內容來看,當你有很多數據時,你應該堅持核心數據。就我而言,我通常擁有大量的數據,但是我從來沒有真正感受到應用程序的性能下降。所以我的問題是:

  1. 在這種情況下,如果有時(天氣事情只是一個 例子)我只是需要刪除所有數據(Twitter的飼料,爲 爲例),並通過更換全新的數據流,是Core 數據價值?我認爲刪除所有數據並插入(填充)它比存儲NSDictionary更重,並取代舊數據。

  2. 有時它會進化得只剩圖像,TEXTFILES等和 NSFileManager做它完美,所以有什麼優點可以睿 數據在此情況下,帶來了什麼?

P.S:我剛纔看到this後,在這種問題是由和數字證明了這一個實際上要快。不過,我還想要一個經驗的答案。

回答

2

核心數據值得在您描述的每種情況下使用。事實上,如果一個應用程序存儲多於首選項,那麼你應該使用核心數據。這裏有一些原因,其中,你會發現答案你自己的問題:

  • 肯定比文件系統更快,即使你消滅一切,你描述再寫一遍(讓你不從緩存中獲益很多)。這基本上是因爲您可以合併您的操作並只在需要時才訪問商店。所以,如果你閱讀,寫作和閱讀,你只能保存一次,其餘的都在內存中完成,不用說,速度非常快。
  • 一切都是版本化的,你可以輕鬆地從一個版本遷移到另一個版本(同時保持用戶在設備上的內容)
  • 80%的模型操作免費。就像,當某些事情發生變化時,您可以覆蓋管理對象方法並通知您的控制器。
  • 使用cascade可以輕鬆地將刪除甚至是非常複雜的對象結構
  • ,同時是一個壞主意,讓圖像在數據庫中,你還可以讓他們在文件系統和擁有核心數據自動刪除當管理對象代表它們被刪除
  • 非常靈活,實際上非常靈活,您可以通過編寫自定義數據存儲將您的項目從使用本地文件系統遷移到使用服務器進行非常少的修改。
  • 核心數據設計師基本上爲您創建模型對象。你並不需要創建自己的模型類(你將不得不如果使用的文件系統)
+0

緩存更適用於離線場景。所以在正常的網絡訪問條件下,我通常會非常頻繁地更換存儲的數據,這就是我擔心的原因。另一個好處是隻使用'NSDictionary'而不需要知道他內部的內容(他是如何組成的)。只有'NSDictionary'的'NSManagedObject'有意義嗎? – Peres

+0

緩存對於本地文件系統也很重要。文件系統訪問比內存訪問慢。我不確定爲什麼你不需要知道該字典裏面的內容,不要將它解讀爲某種觀點。如果您只存儲像任何其他,這恰好是一個序列化的詞典中的文件,那麼是的,有一個在使用核心數據 –

+0

我的意思是沒有意義的,我知道里面有什麼,但如果由於某種原因,一個API的變化,並添加不同的東西,我不受此限制。 – Peres

1

在這種情況下...是核心數據值得嗎?

是的,你需要更多的集中管理而不是試圖繪製自己的文件系統模式。核心數據及其較低級別的表弟SQL仍然是我們現在擁有的持久性的最佳選擇。此外,使用NSKeyed(Un)Archiver繼續對字典進行反覆序列化/反序列化的性能受到更大數據集的關注。

我想刪除所有數據,並插入(填充)它是重 不僅僅是存儲的NSDictionary和新人換舊人。

當然,是的。但是,您不必考慮像這樣的緩存更新。如果您將Core Data想象爲靜態模型,則可以使用緩存層將數據輸入和輸出存儲。需要有關天氣的資源嗎?檢查緩存層。如果它不在那裏,請使緩存運行一個獲取請求。需要翻轉整個緩存?讓緩存空本身,然後運行一個請求來標記具有某種標誌的每個實體以顯示它們是無效的。當您看到所有新數據已安全地緩存在緩存中時,可以通過後臺進程完成您擔心的昂貴刪除操作。

有時它會進化得只剩圖像,TEXTFILES等和 的NSFileManager做它完美,所以有什麼優勢能核心數據 在這種情況下,帶來了什麼?

不幸的是,並不是很多。對於數據斑點(這基本上是Core Data在這些情況下所做的),存儲和從Core Data獲取數據可能會很快導致代價高昂。如果它們沒有被壓縮,它們也可以佔用磁盤上明顯更大的空間(這進一步降低了性能)。如果您需要更快的備選方案,請使用更適合此任務的商店,例如Tokyo CabinetLevelDB,並將核心數據存儲中的實體用作一種替代品,例如包含資源的密鑰那些關係數據庫。

+0

我使用機制(無效)與'NSFileManager'方法。大量的數據。感謝羅伯特的投入。 – Peres