NSURLConnection是否利用了NSURLCache?

时间:2009-12-08 21:35:13

标签: iphone nsurlconnection nsurlrequest

我正在尝试弄清楚如何使用URL加载框架来加载利用缓存的URL。

我正在使用NSURLConnections并为它们提供NSURLRequests。我甚至在那些对NSURLRequestReturnCacheDataElseLoad的请求上设置了cachePolicy。第一次加载请求时,它会自动放入缓存中([NSURLCache sharedCache]拥有它)。但是下次加载相同的请求时,NSURLConnection似乎忽略缓存中的内容并重新加载数据。

我应该手动实现缓存查找并返回缓存数据吗? NSURLConnection不这样做吗?或者有没有办法让框架无缝地使用缓存?

更新:尝试以下操作但未成功:

  • 将请求缓存策略设置为NSURLRequestReturnCacheDataElseLoad而不是NSURLRequestUseProtocolCachePolicy
  • 重新使用请求对象而不是创建新对象
  • 使用+[NSURLConnection sendSynchronousRequest:returningResponse:error:]代替异步加载

3 个答案:

答案 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>