2010-10-29 137 views
1

我正在尋找一堆(〜200)80px圖像緩存80px的最佳讀取性能。一個大卡盤(~50)將全部需要立即訪問。存儲緩存圖像

我應該將uiimages(作爲二進制數據)存儲在plist中還是使用核心數據?

回答

4

幾個基本概念:

  • CoreData可能是要走的圖像數據的最糟糕的方式,文檔指出在店裏BLOB段造成大規模的性能問題。
  • 使用文件系統構建它的內容,讀取/寫入隨機數據塊。

其餘的取決於你如何組織你的數據,所以這裏有一些想法:

  • 80×80是非常小的,你也許可以容納50個左右在給定的時間內存。
  • 您需要一種將圖像散列成某種結構的方式,以便知道要獲取哪些圖像。我將使用核心數據來存儲文件系統上圖像的位置,並使用NSFetchedResultsController返回視圖以提取文件名列表。
  • 使用內存數據結構中的一些來存儲UIImage對象,大小爲50的FIFO隊列在這裏可以很好地工作,因爲它從文件系統中獲取新圖像時彈出最老的圖像。
  • 最後,你必須知道你要查看哪些圖像並保持領先,文件系統讀取速度不會超快,因此您需要將讀取數據塊或保持足夠的視圖避免滯後。如果您的視圖顯示爲50,則可能需要保留100個內存,例如,如果您正在滾動,則會保留100個內存中的前25個內存和下一個內存。

過早優化:

  • 如果讀取性能是至關重要的,這將是值得保存在「頁」大小的塊的圖像,如5幅或N圖像的壓縮,可以是立即讀入內存,然後分割成相應的UIImage文件。
+1

我推薦一個NSDictionary。假設您的數據模型是CoreData,您可以將指針值作爲關鍵字將圖像存儲在Dictionary中。 '[imageThumbnails objectForKey:[NSNumber numberWithInt:(int)referenceObject]] Wabbits對性能的擔憂是完全正確的 - 如果你不保持領先於tableview,並且在滾動時觸擊文件系統將會是一個巨大的打擊。 80x80的拇指可以輕鬆地預先加載到一個塊中。 – 2010-10-29 20:41:24

+1

@Michael,一個NSDictionary是一個很好的解決方案,數據被加載到一個塊中,但是NSMutableDictionary不是線程安全的,並且如果你試圖限制在給定時間內有多少圖像在內存中,可能會有問題。 – ImHuntingWabbits 2010-10-29 21:12:14

+0

@Wabbits,夠了。在我自己的解決方案中,我實際上使用可變字典構建對象,然後將其存儲爲非可變字典。我發現你可以在那裏加載大量的縮略圖而不消耗太多的內存。 – 2010-10-29 21:39:53