2012-11-27 43 views
0

我目前正在從CoreData中檢索我的UITableViewCell縮略圖圖像。這是一個2k的最大png。優化從CoreData加載的UITableViewCell縮略圖

實際上它工作正常,用戶沒有注意到任何緩慢,但我想改進避免太多CoreData請求的機制。

事實上,單元格在需要的時候被加載,這很好,但是問題是CoreData的請求總是針對要傳遞的每個單元格進行的。一種可能的解決方案是僅當表視圖停止滾動時才加載縮略圖,但是對於此解決方案,單元格顯示爲具有公共共享圖像,因爲我已經實現了prepareForReuse,它實際上重置了單元格。

那麼,有沒有簡單的方法來緩存CoreData圖像,我想在內存中,並檢索它?

我的Objective-c知識仍然有限,所以我能想到的最快解決方案是一個NSIndexPath.row-> UIImage字典(我的表沒有部分),但我不知道其他簡單優雅的解決方案可以實施。

+0

Infact,持久存儲ie。每次你從coredata請求數據時,都不會查詢sqlite數據庫。有一種叫做coredata的錯誤機制,它在第一次獲取時緩存對象。您需要重置上下文或刷新對象以指示核心數據再次觸擊數據庫。所以,沒有問題,因爲它作爲普通對象出現故障,您只需確保重置或刷新對象的次數更少。 – Sandeep

+0

因此,考慮到我將圖像作爲實體進行檢索,所以不需要使用任何緩存機制。在這種情況下,我最終會得到兩個緩存,我的和CoreData,會浪費更多的內存。我理解對嗎? – Leonardo

+0

好吧,核心數據是一個永久性的緩存,你不會總是激發sql查詢只是爲了檢索幾張圖片。你會 ?此外,您使用的映像不超過2k,但如果它是較大的映像,那麼肯定保存在本地磁盤是一種更好的方法。即使將圖像保存在本地磁盤中,您也可以創建UIImage對象,然後緩存一些操作。所以,我認爲你不會付出巨大的代價。 – Sandeep

回答

0

該解決方案對我來說似乎非常簡單和優雅。出於各種原因,我只能將注意力放在使用NSCache而不是字典上。自動刪除是其中之一,您也可以設置不同的刪除策略,限制和更多(來自不同線程的訪問,沒有鎖定似乎不適合您的情況)。所以這可以爲你節省幾行代碼。

+0

正如你建議我使用NSCache,易於設置和使用。我發現很大的改進,特別是在桌面滾動期間不時發生的所有閃爍都消失了。但是,由於表數據源的改變,我不得不實現緩存更新的一個非常小的邏輯。 – Leonardo

+0

太棒了,我很高興能幫上忙。總是有一些定製的邏輯。訣竅是獲得適當的平衡。 –