2010-02-21 40 views
5

我試圖改善使用單元格與從網絡獲取的圖像但存儲在NSCachesDirectory中的UITableView的滾動性能。單元格具有自定義內容視圖來繪製內容(圖像)。將UIImage對象的系統緩存與從磁盤緩存(NSCachesDirectory)加載的圖像配合使用?

當我使用應用程序包中的佔位符圖像時,使用[UIImage imageNamed:@"Placeholder.png"],滾動性能非常快。

當我使用[UIImage imageWithContentsOfFile:cachePath]從磁盤緩存(NSCachesDirectory)加載圖像時,滾動性能變差。

根據文檔,imageNamed:緩存圖像和imageWithContentsOfFile:沒有。

如何在使用imageWithContentsOfFile:時使用UIImage的系統緩存?

非常感謝!

+0

您可能想查看我的[最近的問題](http://stackoverflow.com/questions/18750686/how-to-find-uiimage-bottleneck#comment27641913_18750686),我通過存儲未壓縮的圖像來解決問題。 – 2013-09-28 00:12:12

回答

8

似乎可以使用NSCachesDirectory中圖像的路徑作爲[UIImage imageNamed:]方法的參數。該方法接受相對路徑(相對於應用程序包),例如:@"../Library/Caches/SomeCachedImage.png"作品。

如果多次使用UIImage會自動將圖像緩存在內存中,這可以提高在表視圖中多次使用圖像時的性能。

+0

對我來說,這種方法[UIImage imageNamed:]無法加載我在特定路徑給出的圖像,總是返回零爲 – vodkhang 2010-08-20 02:48:49

+0

爲我工作。我會嘗試使用NSPicturesDirectory,它值得! – 2011-08-31 17:06:29

0

你不能。 imageWithContentsOfFile:將始終從文件加載圖像(儘管很懶惰)。你可以做的是創建一個內存緩存,你擁有NSArrays或NSDictionaries,這取決於你想要如何查找。

3

問題很可能是您正在主運行循環中加載和解壓縮映像。這會在短時間內阻止用戶界面。如果您在單獨的線程中執行加載和解壓縮,並且只有將主循環中的圖像設置爲,則會獲得更好的性能。 (這也是用戶界面更改所需的,它在UIImageView上設置圖像)

這將需要更多的基礎設施。例如通知方案或關鍵值觀察。

+0

是的,這正是問題所在。我希望有一個現成的解決方案。但我猜這不在那裏。感謝你的回答。 – 2010-02-22 13:52:45

+0

如果你喜歡答案,你應該upvote或標記爲解決。 – 2010-02-22 15:26:22

+0

UIImage懶惰地解壓縮圖像位圖數據,所以在許多(大多數情況下)這並不會真的有幫助 - 從磁盤加載將發生在後臺線程上,但解壓縮(通常需要比加載數據更長的時間)會在您設置圖像,這必須發生在主線程上。 – 2011-09-29 01:49:40