11

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

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

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

更新:尝试了以下但没有成功:

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

3 回答 3

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 上找到了许多磁盘缓存的示例,但恕我直言,它们都没有完成完全必要的“修剪”步骤。

于 2010-10-10T13:12:55.087 回答
0

您是否尝试过弄乱该connection:willCacheResponse:方法?根据URL 加载系统文档,“默认情况下,连接的数据根据​​处理请求的 NSURLProtocol 子类提供的支持进行缓存。NSURLConnection 委派可以通过实现连接进一步细化该行为:willCacheResponse:。”

于 2009-12-17T02:42:55.207 回答
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;
}
于 2009-12-10T23:24:17.090 回答