我正在尝试弄清楚如何使用URL加载框架来加载利用缓存的URL。
我正在使用NSURLConnections并为它们提供NSURLRequests。我甚至在那些对NSURLRequestReturnCacheDataElseLoad的请求上设置了cachePolicy。第一次加载请求时,它会自动放入缓存中([NSURLCache sharedCache]
拥有它)。但是下次加载相同的请求时,NSURLConnection似乎忽略缓存中的内容并重新加载数据。
我应该手动实现缓存查找并返回缓存数据吗? NSURLConnection不这样做吗?或者有没有办法让框架无缝地使用缓存?
更新:尝试以下操作但未成功:
NSURLRequestReturnCacheDataElseLoad
而不是NSURLRequestUseProtocolCachePolicy
+[NSURLConnection sendSynchronousRequest:returningResponse:error:]
代替异步加载答案 0 :(得分:6)
注意 iOS 5以后版本提供了一个具有 内存和磁盘容量的sharedURLCache。
除非您将NSURLCache设置为具有一些容量,否则不会缓存:
// A 10MB cache. This a good avatar-image-cache size but might be too
// large for your app's memory requirements. YMMV.
[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];
默认的iPhone NSURLCache实例拒绝永久缓存到磁盘。如果您需要此行为,则必须对NSURLCache进行子类化并实现自己的磁盘缓存。我在GitHub上找到了很多磁盘缓存的例子,尽管它们都没有完全必要的“修剪”步骤令人满意地恕我直言。
答案 1 :(得分:0)
至少在某些情况下,它确实会自动使用NSURLCache。当然,它在以下代码中执行:
编辑 - 适用于OS X 10.6 Cocoa应用程序,而非iPhone(误读问题)
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
// run request with default cache policy
NSMutableURLRequest *req=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/"]];
NSData *data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
NSLog(@"Received %d bytes", [data length]);
sleep(10);
// now run it asking it to use the cache
[req setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
NSLog(@"Received %d bytes", [data length]);
return 0;
}
答案 2 :(得分:0)
您是否尝试过使用connection:willCacheResponse:
方法?根据{{3}},“默认情况下,根据处理请求的NSURLProtocol子类提供的支持来缓存连接数据.NSURLConnection Delegationdelegate可以通过实现连接进一步优化该行为:willCacheResponse:。”< / p>