NSURLCache 不起作用
Posted
技术标签:
【中文标题】NSURLCache 不起作用【英文标题】:NSURLCache doesn't work 【发布时间】:2014-01-27 17:32:54 【问题描述】:我在我的应用委托中初始化了 NSURLCache,如下所示:
int cacheSizeMemory = 4*1024*1024; // 4MB
int cacheSizeDisk = 32*1024*1024; // 32MB
MyServerCache *sharedCache = [[MyServerCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[MyServerCache setSharedURLCache:sharedCache];
然后我使用默认缓存策略创建一个请求并调用:
[NSURLConnection sendSynchronousRequest: urlRequest
returningResponse: &response
error: pError ];
响应的类型为“application/json”,并且“Cache-Control”设置为“private, max-age=600”。响应只有 874 字节(不应该太大而无法缓存),但是 NSURLCache 似乎不起作用。
我已经在模拟器上运行它并寻找似乎不存在的磁盘缓存,因此我将 NSURLCache (MyServerCache) 子类化并覆盖以下方法以查看它们是否被调用:
-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
NSLog(@"Returning cached response for request: %@", request);
return [super cachedResponseForRequest:request];
-(void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request
NSLog(@"Caching response for request: %@", request);
[super storeCachedResponse:cachedResponse forRequest:request];
无论我做什么(我已经尝试了几种不同的 API 和响应),NSURLCache 似乎永远不会缓存任何东西。我永远无法在文件系统中找到磁盘缓存,并且从未在我的 NSURLCache (MyServerCache) 子类上调用上述方法。
我真的很想使用它而不是滚动自己的缓存,但我不知道为什么它不工作或如何让它工作。请帮忙。
【问题讨论】:
什么是UVMServerCache?为什么不用 NSURLCache 而不是这个类呢? 它是 NSURLCache 的一个子类,在这里我只重写了上面提到的方法。我这样做是为了能够知道它是否真的在尝试缓存响应和/或返回缓存的响应。因为我在 NSURLConnection 上使用了一个类方法,所以我无法实现它的委托方法来尝试在那里拦截......所以子类化 NSURLCache 似乎是唯一的其他选择...... 您是否尝试使用标准类而不是自定义类?仅供测试,也许你会在这之后找到一些磁盘缓存? 我先试过了。当这不起作用时,我进行子类化以更好地了解实际发生的情况。 @HackyStack 你有没有想过这个问题?我正在使用 ios7 的 NSURLSession 类(使用 NSURLCache)做类似的事情。 ***.com/questions/21957378/… 【参考方案1】:您必须使用NSURLRequestUseProtocolCachePolicy
创建您的请求,并且它与 NSURLCache 完美开箱即用。
NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:cachePolicy
您可以在此处阅读有关 NSURLRequestCachePolicy 的信息:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/#//apple_ref/c/tdef/NSURLRequestCachePolicy
iOS 总是返回 200 - Success
有点令人困惑,所以当响应来自缓存时,你永远不会得到 304 - Resource not Modified
。
因此,在监控服务器端时更容易看到缓存策略的工作。
您可以使用https://github.com/PaulEhrhardt/Simple-Cache-Test 来验证缓存控制、过期和 ETag 与一个小的本地 ruby 服务器。只需几行即可设置。我使用 7.1 和 8.4 iOS SDK 都成功测试了。
【讨论】:
以上是关于NSURLCache 不起作用的主要内容,如果未能解决你的问题,请参考以下文章