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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WKWebView 进行清单请求

transpportrule不起作用

PHP.INI不起作用

C#DataGridView的行列表头背景色字体色不起作用

关于Animate css不起作用的原因

修改php.ini不起作用是为啥