2012-02-19 50 views
2

簡短說明UITableViewCells中的縮略圖圖像的內存處理

目前我有一個包含網站視頻單元格的UITableView。另外,每個單元格(代表一個視頻)都有一個特定的縮略圖圖像。這些圖像使用NSURLConnection異步下載(所以我不必擔心自己穿線)。當這些圖像對象已經下載時,他們只需通知UITableView刷新它所屬的單元。

我的問題

由於標準也會有進賬10部新影片的UITableView的每個呼叫。這意味着用戶被允許推送UITableView底部的一個單元來請求10個新視頻等等。這裏的問題是很快就會出現大量的內存使用情況,因爲無論如何,所有縮略圖圖像(在UITableView中)的數據仍然存在。

是否有一種智能的方式可以取消當前不在視圖中的圖像對象?

此外,UITableView直接從我從網站中獲取的所有視頻對象的數組中直接渲染其所有單元格。這意味着用戶可以請求新視頻的次數沒有限制,從而使陣列始終變得越來越大。將這些數組始終保存在內存中是正確的嗎?或者,你應該刪除那些從視圖中刪除並稍後再次請求的視圖?

預先感謝您

回答

0

如果您創建自己的類VideoTableViewCell作爲UITableViewCell的子類,並且您爲單元格指定了圖像的屬性,那麼只要單元格離開屏幕,該圖像就會被釋放。一旦Cell返回視圖,單元和圖像將被重新創建。

對於視頻,我會將所有下載的視頻文件存儲在文檔文件夾中,並將URL存儲在數組中。如果單元格可見或被點擊,只需從硬盤驅動器加載文件即可。

+0

簡單和工作,謝謝:) – Luffen 2012-02-19 17:39:35

1

如果您使用的排隊,並在您的tableview去排隊細胞的標準方法的方法,那麼你真的應該只使用細胞意見(及其相關的縮略圖)少數 - 例如,分配的單元格視圖總數不應超過屏幕上可查看的最大數量,並且通過擴展,分配/引用縮略圖圖像的數量不應超過單元總數。每次您呈現表示新電影的行時,imageview都可能會重用,因爲它是新的。

你想要考慮的是你的數據數組(你下載的剪輯數組,其中可能有無限制的對象)與你的tableview數組單元格完全不相關,這將是一個相對較小的數字。

我的建議是設想下載緩存的圖像。基本上,下載縮略圖後,爲每個字符分配一個唯一的字符串ID,並將實際的映像文件寫入磁盤。將唯一的ID字符串分配給模型對象。當您的tableview準備呈現圖像時,使用id字符串找到單元格的圖像,從磁盤加載圖像並填充圖像視圖。只要你沒有保留圖像,當圖像出現在屏幕外時,圖像應該被釋放。您還可以在低內存條件下清空已加載圖像的緩存。

+0

感謝您的努力,但去了簡單的版本:) – Luffen 2012-02-19 17:39:27

+1

當然。這幾乎是相同的答案;無論是否將其分配給通用或自定義單元格子類,您的圖像都將被釋放。 – isaac 2012-02-19 18:36:23