2012-01-27 28 views
9

似乎UIWebView並不總是每次調用storeCachedResponse:forRequest:加載資源。有誰知道爲什麼?我試圖通過使用-[NSURLCache storeCachedResponse:forRequest:]來緩存圖像,但它的大部分工作都很好,但在某些情況下,UIWebView不會在頁面加載時調用此方法,其中實際上有圖像。UIWebView並不總是調用 - [NSURLCache storeCachedResponse:forRequest:]

+0

我注意到這一點也;雖然只有*在*設備爲我的應用程序。當Web視圖從NSURLCache加載請求時,它似乎跳過該頁面上資產的相同緩存。 – Nevir 2012-03-28 01:05:42

回答

4

如上所述hereNSURLConnection如果文件大小超過50kb(52428字節),則不會調用storeCachedResponse:forRequest:
嘗試ASIHTTPRequestcaching

+0

我看到這個小文件(100字節)也是如此。 webview也無法調用'cachedResponseForRequest:' – Nevir 2012-03-29 21:40:12

+0

@Nevir請參閱[我的答案](http://stackoverflow.com/a/9968398/517815)。 :) – MrGomez 2012-04-01 21:14:43

2

您是否檢查過HTTP狀態和緩存標頭?過期,緩存控制等?也許一個服務器回答status = 304沒有任何響應正文?

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse 
{ 
    NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode); 
    NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields); 
} 
10

接聽賞金提供的查詢:

我看到這對小文件(字節100S),以及。 web視圖 也沒有叫cachedResponseForRequest:

我發現this question解決此行爲直接:

儘管蘋果的文檔indicating otherwiseNSURLCache iOS上沒有做任何磁盤(閃存)緩存在所有。 您 可以繼承NSURLCache改變獲取和 存儲操作的行爲,使用的磁盤(如 SDURLCache一樣),但由於 以下的嚴格限制如何使用高速緩存和實施, 這不工作,以及你所期望的:

  • NSURLConnection甚至不叫storeCachedResponse:forRequest:的文件在50KB左右(> = 52428 字節,要準確)。這使得NSURLCache繼承我們的使用(200KB圖像)是毫無意義的,因爲它甚至不會進入緩存。作爲 的結果,我們必須在高於 NSURLConnection的級別手動添加高速緩存。

  • 即使一個調用NSURLCache的內置storeCachedResponse:forRequest:手動,只保存在內存中 響應,如果是小於180KB。我通過 手動調用storeCachedResponse測試了這一點,並且看到 currentMemoryUsage之前/之後的數據長度在大約180KB以上沒有變化。 所以我們也必須編寫自己的LRU內存緩存。

(重點煤礦。)

這似乎是負責的行爲被調用出來。由於the current accepted answer points out,ASIHTTPRequest是此行爲的預期解決方法。

然而,注意警告頁面的頂部:

請注意,我不再從事這個庫 - 你可能要考慮使用別的新項目。 :)

您應該考慮依賴支持的庫,或者,如果您願意,一旦它成爲您的代碼的基礎之後,回饋給此庫。

+1

欣賞它:)(一個很好的例子,我應該更努力地搜索) - 謝謝花時間徹底挖掘這個! – Nevir 2012-04-02 00:56:20

+0

@Nevir沒問題!我很高興這很有用。 :) – MrGomez 2012-04-02 01:33:37

+0

有誰知道這是否仍然是iOS 7/8上的NSURLSession的情況?我在使用NSURLCache保存大型(〜7MB)圖像文件時遇到了問題。 – 2014-11-20 14:36:01

2

我不知道它是如何工作的UIWebvieuw,但是當你使用的NSURLRequest文件的最大大小取決於你如何初始化Urlcache文件(initWithMemoryCapacity:(NSUInteger)memoryCapacity ...) 我只是緩存一個2MB的文件

+0

對我來說,從UIWebView請求的515KB .css文件可以用'memoryCapacity:0 diskCapacity:1024 * 1024 * 256'初始化的'NSURLCache'子類的'cachedResponseForRequest:'處理。 – hiroshi 2014-08-11 02:52:10

3

NSURLCache作品有兩個不同的緩存:磁盤緩存和內存緩存

  • 響應將被緩存在內存中緩存如果響應的大小是根據 50KB 和
  • 迴應將被緩存到磁盤上的緩存,如果響應的大小是超過 50KB

如果用diskPath零初始化NSURLCache那麼磁盤緩存也不會主動和storeCachedResponse:forRequest:將只要求響應大小在50kb以下。

所以配置Urlcache文件這樣

[[MYCustomURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
          diskCapacity:20 * 1024 * 1024 
          diskPath:@"urlcache.db"]; 
相關問題