2013-10-16 126 views
4

我正在使用[SDWebImageDownloader.sharedDownloader downloadImageWithURL]將選項設置爲0來下載圖像。我最初沒有對它們進行任何操作,並且理解它們將被緩存。但是,當我使用完全相同的函數來稍後顯示圖像時,該函數將再次下載圖像,而不是從緩存中獲取(圖像緩存類型爲0)。在這兩種情況下,圖像的url都是一樣的。我對緩存的理解是否有誤?SDWebImage不緩存

+0

是否要下載一些圖像,然後將其保存在您的應用程序內,或者您只是想用來自互聯網的一些圖像填充imageView? –

+0

爲了讓它們緩存,我首先下載了它們,以便當用戶確實想要看到圖像時,他不必等待。 – pickwick

+0

@mbachrach如果你只是預取接下來的幾個,那很好。但是,如果您預取了數百張圖片,那可能會造成嚴重問題。 (a)不要使用太多的網絡資源; (b)將當前用戶界面優先於後臺請求; (c)可能限制急切的加載(例如,滾動,預取下兩個圖像,但不是全部)。那裏有很多問題。無論如何,在我的道歉中,我更新了一些關於渴望加載過程的暗示性思考的答案。 – Rob

回答

7

享受緩存功能的最簡單方法是使用SDWebImageManager而不是SDWebImageDownloadSDWebImageManager提供SDImageCache功能,而如果您使用SDWebImageDownload,則必須依賴NSURLCache(存在限制/問題)或編寫自己的緩存代碼。

也(和古斯塔沃的問題隱含的),如果你只是想設置一個UIImageView的形象,它實際上是更好的,不使用任何這些類的,並使用UIImageView+WebCache類別。它享有所有的緩存功能SDWebImageManager,但也提供了其他優勢(尤其是重用的UITableViewCellUICollectionViewCell對象)。


在給其他用戶的評論,你說你正在下載的所有圖像的先進,「只是爲了讓他們緩存,這樣,當用戶實際上不希望看到他不」的圖像不得不等待。「

這是一個偉大的舒展的目標,但這種預取(有時稱之爲預先加載,相反,更常見的延遲加載)有幾個含義:

  • 除非你有信心用戶確實需要全部的圖像,這是他們的移動設備的蜂窩數據計劃的積極使用,所以也許你應該只在WiFi上(這可以由Reachability確定)這樣做。蘋果甚至拒絕了使用太多蜂窩帶寬的應用。

  • 該應用程序在內存方面將超過必要的積極性(導致更多暫停的應用程序被終止,這不會影響您的應用程序的用戶體驗,但蘋果要求我們都是好公民,而不是更多地使用RAM比我們需要的)。同樣,如果用戶需要圖像的全部,那麼這是一件很好的事情,但如果不是這樣,則應該真正地最小化內存消耗,而不是將緩存加載到當前可能不需要的東西會話。另外請注意,下載一些可能需要下載的東西,但僅僅作爲一種預防措施也有(適度的)電池影響。

  • 如果您對後臺數據有很多請求,請確保您沒有使用所有有限的網絡連接(只有五個),並用很多請求積壓系統。好的是,UI UIImageView類別自然有利於當前的UI(從根本上說,它是一種延遲加載機制)。但是,假設有100個圖像,用戶觸發應用程序並滾動到列表的底部。你真的想要#90(這是在屏幕上,用戶正在等待)的請求等待#1-89完成嗎?

    查看WWDC 2012視頻Asynchronous Design Patterns with Blocks, GCD, and XPC,第7部分,「分離控制和數據流」,約48分鐘進入視頻,討論如何解決問題。

    如果沒有別的,我會確保您使用網絡鏈接調節器(MacOS的硬件IO工具的一部分或設備上的設置>常規>開發者)測試應用程序。因此,打開網絡鏈接調節器,移除並重新安裝應用程序(清空持久性存儲緩存),然後以慢速連接啓動應用程序,嘗試在圖像加載過程中四處瀏覽。一個簡單的「讓我們開始預取所有內容」可能無法爲您真正想要的慢速網絡上的當前用戶界面提供必要的優先級。

所有這一切說,你可能已經通過所有這些影響的思想,如果是這樣,我爲操勞了明顯的道歉。只是在對所有圖像進行積極的預取之前,必須小心謹慎。

+1

我實際上是在一個地方使用WebImageManager,而在另一個地方使用SDWebImageDownload:在一天結束時,一切都變得模糊。現在在兩個地方都使用經理,一切都按預期工作。謝謝。 – pickwick

+0

感謝您的意見。 – pickwick