2011-09-02 91 views
1

我正在看Nimbus項目中的NINetworkImageView,並對默認的緩存設置感到好奇。一旦我調用setPathToNetworkImage並加載一個圖像,它是否會進入全局緩存?如果我們使用相同的pathToNetworkImage創建另一個networkImageView,並因此避免網絡請求,是否足夠聰明地認識到它是相同的圖像?iOS Nimbus中NINetworkImageView的默認緩存行爲是什麼

默認存儲在內存或磁盤中嗎?什麼是默認緩存時間?

回答

6

一旦我調用setPathToNetworkImage並加載圖像,它是否在全局緩存中?

是的。默認情況下,它將進入Nimbus的全球內存圖像緩存。以下是後臺發生的事情:一旦圖像加載完畢,圖像返回到UI線程之前,原始圖像就存儲在磁盤緩存中[1]。加載線程返回後,原始圖像將設置爲UIImageView,原始圖像也會存儲在內存中緩存中。

如果我們使用相同的pathToNetworkImage創建另一個networkImageView並且從而避免網絡請求,是否足夠聰明地認識到它是相同的圖像?

是的。只要它具有所有相同的可配置屬性[2],它將立即從內存中緩存中加載映像(如果存在)。您可以在這裏看到如何生成映像的緩存鍵:https://github.com/jverkoey/nimbus/blob/master/src/networkimage/src/NINetworkImageView.m#L144

[1]這是因爲存儲到磁盤是一種阻塞操作,我們不希望阻塞UI線程。

[2]如果您有兩個網絡圖像視圖加載相同的url,但一個具有不同的內容模式,則圖像需要處理兩次,因爲內存中的緩存密鑰將不同。也就是說,只有圖像URL用於磁盤緩存密鑰,因此我們最終只會擊中網絡一次,緩存圖像,然後是第二個網絡圖像視圖從磁盤加載圖像並使用其他內容裁剪圖像模式。

另外:它看起來兩個緩存屬性的文檔是borked,所以我將不得不解決這個問題。

+0

嗨,謝謝你的回答。磁盤和內存中對象的高速緩存持續時間有多長?它是否將它保存在磁盤和內存中,直到達到預定的限制maxNumberOfPixelsUnderStress,我應該手動設置它?該設置是否也適用於磁盤緩存?默認情況下,我將如何全局禁用磁盤緩存以用於應用程序中的圖像? – MonkeyBonkey

+0

>磁盤和內存中對象的高速緩存持續時間有多長? http://jverkoey.github.com/nimbus/interface_n_i_image_memory_cache.html 全球內存中的高速緩存默認在任何意義上都是無界的。在不修改maxNumberOfPixels屬性的情況下,圖像將從緩存中刪除的唯一方法是明確或過期。 磁盤高速緩存的持續時間由網絡映像視圖上的diskCacheLifetime屬性確定。 https://github.com/jverkoey/nimbus/blob/master/src/networkimage/src/NINetworkImageView.h#L25 – featherless

+0

請注意,maxNumberOfPixelsUnderStress將僅在發出內存警告時使用。這是發出內存警告後應保留在緩存中的像素數。與每次添加圖像時用於限制內存中圖像緩存大小的maxNumberOfPixels對比。 – featherless