[英]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
使用兩種不同的緩存:磁盤緩存和內存緩存
如果使用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.