是否可以从AFNetworking中禁用所有缓存功能?
我正在构建自己的自定义缓存系统,并且不希望这也占用磁盘空间。
谢谢, 阿什利
答案 0 :(得分:25)
NSURLCache
在应用程序范围内处理缓存。如果未设置共享缓存,则不会缓存请求。即使使用共享NSURLCache
,iOS上的默认实现也不支持磁盘缓存。
那就是说,除非你有一个非常特别的理由来编写自己的缓存系统,否则我会强烈推荐它。对于99.9%的应用程序来说,NSURLCache
足够好了:它处理来自传入响应的缓存指令,并在新请求中适当地使用它们,并以一种不太可能成为应用程序性能瓶颈的方式自动执行。作为一个浪费了无数时间自己制作一个人的人(以后因为完全没必要而扔掉它),我会说有更好的地方可以集中你的发展注意力。
答案 1 :(得分:25)
最初我找到了Jason Moore的工作答案,但最近我注意到我的应用程序仍在缓存请求。我没有使用最新的AFNetworking,所以我不知道在最近的版本中是否已经解决了缓存问题。
Apple的URLCache项目有这样的说法:
默认情况下,Cocoa URL加载系统使用小型共享内存 缓存。我们不需要这个缓存,因此我们将它设置为零 应用程序启动。
然后执行此操作以禁用缓存。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
这将禁用整个应用的所有缓存,这在某些情况下可能并不理想,但由于NSURLRequest
未遵循请求的缓存策略,因此它是我唯一能看到的选项。
答案 2 :(得分:23)
我在iOS 6上发现,即使请求有NSURLRequestReloadIgnoringCacheData
,有时也会缓存请求。添加返回nil
的缓存响应块可防止缓存请求。
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:20];
AFJSONRequestOperation *op =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request];
// DISABLE CACHE //
[op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
return nil;
}];
[op start];
答案 3 :(得分:10)
不幸的是,这些方法都不适用于我。我设法禁用缓存的唯一方法就是这样:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
答案 4 :(得分:0)
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
答案 5 :(得分:0)
这可能取决于您的服务器实现,但在传出请求中添加 var threeObjects = {};
标头应该会产生包含相同标头的响应,从而命令Cache-Control:no-store
不将响应缓存到磁盘。
恕我直言,这是比完全禁用磁盘缓存更好的方法,特别是如果您正在编写将由其他可能想要使用NSURLCache
的应用程序使用的SDK代码。