首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLCache不工作

NSURLCache不工作
EN

Stack Overflow用户
提问于 2014-01-28 01:32:55
回答 1查看 1.2K关注 0票数 0

我在我的应用委托中初始化了NSURLCache,如下所示:

代码语言:javascript
复制
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]; 

然后,我使用默认缓存策略创建一个请求,并调用:

代码语言:javascript
复制
[NSURLConnection sendSynchronousRequest: urlRequest
                      returningResponse: &response
                                  error: pError ];

响应类型为"application/json“,并将"Cache-Control”设置为"private,max-age=600“。响应只有874个字节(不应该太大而无法缓存),但是NSURLCache似乎不起作用。

我在模拟器上运行了它,并查找了似乎不存在的磁盘缓存,因此我对NSURLCache (MyServerCache)进行了子类化,并覆盖了以下方法,以查看它们是否被调用:

代码语言:javascript
复制
-(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];
}

无论我做什么(我尝试了几种不同的应用程序接口和响应),NSURLCache似乎从来没有缓存过任何东西。我永远不会在文件系统中找到磁盘上的缓存,并且我的NSURLCache (MyServerCache)的子类也永远不会调用上面的方法。

我真的很想使用它,而不是滚动我自己的缓存,但我不知道为什么它不工作,也不知道如何让它工作。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 22:41:56

你必须用NSURLRequestUseProtocolCachePolicy来创建你的请求,而它在NSURLCache中开箱即用就能完美地工作。

代码语言:javascript
复制
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来验证缓存控制、expires和ETag以及一些本地ruby服务器。只需要几行代码就可以设置好。我用7.1和8.4 iOS软件开发工具包成功地测试了这两个版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21387622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档