簡體   English   中英

UIWebView並不總是調用 - [NSURLCache storeCachedResponse:forRequest:]

[英]UIWebView doesn't always call -[NSURLCache storeCachedResponse:forRequest:]

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

回答賞金提供者的查詢:

我也看到了這個小文件(100字節)。 webview也無法調用cachedResponseForRequest:

我發現這個問題直接解決了這個問題

盡管Apple的文檔另有說明NSURLCache iOS上的NSURLCache根本不進行任何磁盤(閃存)緩存。 您可以將NSURLCache子類NSURLCache以更改獲取和存儲操作的行為以使用磁盤(如SDURLCache那樣),但由於以下嚴格限制了如何使用和實現緩存,這不會像您那樣有效。 d期望:

  • NSURLConnection甚至不調用storeCachedResponse:forRequest:對於大約50KB(> = 52428字節,確切地說)的文件。 這使得子類NSURLCache對我們的使用毫無意義(200KB圖像),因為它甚至不會進入緩存。 因此,我們必須在NSURLConnection以上的級別手動添加緩存。

  • 即使一個人調用NSURLCache的內置storeCachedResponse:forRequest:手動,它只會將響應存儲在內存中,如果它小於大約180KB。 我通過手動調用storeCachedResponse,看到這個測試的前/后currentMemoryUsage沒有為數據長度超過大約180KB改變。 所以我們也必須編寫自己的LRU內存緩存。

(強調我的。)

這似乎是被召喚出來的行為的原因。 正如當前接受的答案指出的那樣ASIHTTPRequest是此行為的預期解決方法。

但是,請注意頁面頂部的警告:

請注意,我不再使用此庫 - 您可能需要考慮使用其他新項目。 :)

您應該考慮依賴受支持的庫,或者,如果您願意,一旦它成為您的代碼的基礎,就會回饋此庫。

如此處所述 NSURLConnection不調用storeCachedResponse:forRequest:如果文件大小超過50kb(52428字節)。
嘗試ASIHTTPRequest 緩存

NSURLCache使用兩種不同的緩存:磁盤緩存和內存緩存

  • 如果響應大小低於 50kb,響應將被緩存到內存緩存中
  • 如果響應大小超過 50kb,響應將緩存到磁盤緩存

如果使用diskPath nil初始化NSURLCache,則磁盤緩存將不會處於活動狀態,並且只會針對50kb以下的響應大小調用storeCachedResponse:forRequest:

所以像這樣配置你的URLCache

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

我不確定UIWebvieuw是如何工作的,但是當你使用NSURLRequest時,文件的最大大小取決於你如何初始化URLCache(initWithMemoryCapacity:(NSUInteger)memoryCapacity ...)我剛剛緩存了一個2MB的文件

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM