2012-07-24 61 views
3

我計劃構建一個主要內容爲圖像的應用程序。基本上,它將有多個菜單使用UITableViews,其單元格將只有一個圖像。當你點擊這個單元格時,你將被推到一個帶有該圖像和另一個圖像的簡單視圖,其中有詳細內容的其餘部分。將圖像保存爲核心數據以便在UITableView中使用

這很容易做,我的問題是關於優化。它會有很多的內容(也許1k行),它會在UITableView顯示圖像,所以核心數據是必須的(因爲它是延遲加載和其他幾種優化)

我的問題是:什麼是最好的,以存儲圖像在Core Data db(如NSData)或只存儲圖像的名稱?我想象的是,如果我存儲資源的名稱,對於UITableView中的每一行,設備必須獲取該圖像,然後處理該圖像,最後顯示該圖像。當滾動它們時(預計會發生很多),我們會有很多提取圖像。如果我將它們存儲在Core Data中,就像獲取該信息並將它用作圖像的位置一樣簡單。

將圖像存儲在Core Data中的好處與在數據庫中存儲blob的正常退出一起提供。我不知道核心數據會有多少問題(我在dbs上的經驗主要來自MySQL)

另一方面,我的「常識」強制保存名稱和獲取圖像因爲他們需要更多的時間,如果他們需要更多的時間,我不確定會有多大的表現。有沒有「最好的方式」來存儲它們?只需要名稱,然後撥打pathForResourse:ofType:或(如果速度更快)mainBundle上的pathForResourse:ofType:inDirectory:,請存儲URI或其他形式的指向它的名稱。

編輯:應用程序將具有應用程序隨附的靜態內容,用戶將無法以任何方式修改此內容。 (至少在1.0版本)

+0

這些圖像有多大? – 2012-07-24 18:23:01

+0

相當小,每個上衣20kb?它們是包含文本和符號的圖像,黑白 – Daniel 2012-07-24 19:01:07

+0

如果它們不是太大,我不會太擔心它,除了您可能想要將斑點放在單獨的對象中,以便您可以加載元數據分開。 – 2012-07-25 12:04:58

回答

5

Core Data Release Notes for iOS v5.0:如圖片縮略圖

小數據值,可以有效地存儲在數據庫中,但大的照片或其他媒體最好由文件系統直接處理。您現在可以指定管理對象屬性的值可以作爲外部記錄存儲 - 請參閱setAllowsExternalBinaryDataStorage :.啓用時,核心數據試探性地決定是否應將數據直接保存到數據庫中,或者將URI存儲到它爲您管理的單獨文件中。如果使用此選項,則無法基於二進制數據屬性的內容進行查詢。

的setAllowsExternalBinaryDataStorage:本質上是做你所描述的 「...只是存儲圖像的名字......」

也可參考這些其他問題:

  1. CoreData : store images to DB or not?
  2. Core data images from desktop to iphone
  3. Provide example for why it is not advisable to store images in CoreData?
+0

我最近問同樣的問題,要求具體的例子。您可以添加到列表也http://stackoverflow.com/questions/10848147/provide-example-for-why-it-is-not-advisable-to-store-images-in-coredata – Leonardo 2012-07-26 15:44:31

+0

@萊昂納多謝謝。我已經添加了它。 – Michael 2012-07-26 16:06:12

1

你會得到很大的優化,從剛剛使用該文件的名稱...

如果重新使用一個文件......你不會有將其存儲在數據庫兩次,或者交替使用一個模型對象來代表該文件爲關係。

你可以做一些分析和檢查......但我認爲只是一個名字將是理想的。 你也可以做一些類似於-imageNamed的工作來爲你緩存圖像,並且你只需要爲每個文件創建一個UIImage,無論它存在於程序中的什麼地方。

+0

謝謝,我關心RAM內存優化,而不是使用存儲。而且我幾乎不會重複使用這些圖像。你能否進一步解釋你的'-imageNamed:'主意? – Daniel 2012-07-24 17:41:48

+2

如果您關心內存管理,可以使用NSCache來存儲圖像。 NSCache將「臨時存儲創建昂貴的瞬態數據的對象」,並且如果內存很緊,對象將被「丟棄」,如果丟棄,則必須在需要時重新計算它們的值。請參閱:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSCache_Class/Reference/Reference.html – Michael 2012-07-24 17:47:08

+1

-imageNamed只會創建一個全新的UIImage,如果它沒有一個緩存的,你可以使用NSCache或您自己的實現來做類似的事情。我想NSHashMap是在IOS – 2012-07-24 17:58:40

1

不要將圖像保存在覈心數據中。您可以將有關圖像的信息以有組織的方式保存在覈心數據中,但將圖像保存在項目的支持文件部分。或者,如果您要下載圖像,則可以將它們緩存在應用程序的圖像部分,並簡單地更新核心數據中圖像的信息。