似乎UIWebView
在加载资源时并不总是调用storeCachedResponse:forRequest:
。有谁知道为什么?我正在尝试使用-[NSURLCache storeCachedResponse:forRequest:]
来缓存图像,它可以完成大部分工作,但在某些情况下UIWebView
在页面加载时不会调用此方法,而实际上有图像。
答案 0 :(得分:11)
回答赏金提供者的查询:
我也看到了这个小文件(100个字节)。 webview 也无法拨打
cachedResponseForRequest:
我发现this question直接解决了这种问题:
尽管有Apple的文档indicating otherwise, iOS上的
NSURLCache
根本不执行任何磁盘(闪存)缓存。 您 可以子类NSURLCache
来改变fetch和的行为 存储使用磁盘的操作(如SDURLCache
确实如此,但由于 遵循如何使用和实现缓存的严格限制, 这不会像你期望的那样有效:
NSURLConnection
甚至没有为{50}以上的文件调用storeCachedResponse:forRequest:
(> = 52428) 字节,确切地说)。这使得子类NSURLCache
毫无意义 我们使用(200KB图像),因为它甚至不会进入缓存。作为一个 结果,我们必须在上面的级别手动添加缓存NSURLConnection
。即使手动调用NSURLCache的内置
storeCachedResponse:forRequest:
,它也只会存储 如果它小于大约180KB,则在内存中响应。我测试了这个 手动调用storeCachedResponse并查看之前/之后 对于大约180KB以上的数据长度,currentMemoryUsage
没有改变。 所以我们也必须编写自己的LRU内存缓存。
(强调我的。)
这似乎是被召唤的行为的原因。作为the current accepted answer points out,ASIHTTPRequest是此行为的预期解决方法。
但是,请注意页面顶部的警告:
请注意,我不再使用此库 - 您可能需要考虑为新项目使用其他内容。 :)
您应该考虑依赖受支持的库,或者,如果您愿意,一旦它成为您的代码的基础,就会回馈此库。
答案 1 :(得分:4)
如上所述here NSURLConnection
如果文件大小超过50kb(52428字节),则不会调用storeCachedResponse:forRequest:
。
试试ASIHTTPRequest caching。
答案 2 :(得分:3)
NSURLCache
适用于两种不同的缓存:磁盘缓存和内存缓存
如果使用diskPath nil初始化NSURLCache,则磁盘缓存将不会处于活动状态,只有在50kb以下的响应大小时才会调用storeCachedResponse:forRequest:
。
所以像这样配置你的URLCache
[[MYCustomURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity:20 * 1024 * 1024
diskPath:@"urlcache.db"];
答案 3 :(得分:2)
您是否检查过HTTP状态和缓存标头?过期,缓存控制等?也许服务器回答status = 304而没有任何响应主体?
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse
{
NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode);
NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields);
}
答案 4 :(得分:2)
我不确定UIWebvieuw是如何工作的,但是当你使用NSURLRequest时,文件的最大大小取决于你如何初始化URLCache(initWithMemoryCapacity:(NSUInteger)memoryCapacity ...) 我刚刚缓存了一个2MB的文件