是否可以禁用 AFNetworking 的所有缓存功能?
我正在构建自己的自定义缓存系统,并且不希望它也占用磁盘空间。
谢谢,阿什利
最初我发现 Jason Moore 的工作答案,但最近我注意到我的应用程序仍在缓存请求。我没有使用最新的 AFNetworking,所以我不知道在最近的版本中是否已经解决了缓存问题。
Apple 的 URLCache 项目有这样的说法:
默认情况下,Cocoa URL 加载系统使用一个小的共享内存缓存。我们不需要此缓存,因此我们在应用程序启动时将其设置为零。
然后执行此操作以禁用缓存。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
这将禁用整个应用程序的所有缓存,这在某些情况下可能并不理想,但由于NSURLRequest
不遵守请求的缓存策略,它是我能看到的唯一选项。
缓存在应用程序范围内由NSURLCache
. 如果您不设置共享缓存,则不会缓存请求。即使使用 shared NSURLCache
,iOS 上的默认实现也不支持磁盘缓存。
也就是说,除非您有非常特殊的理由来编写自己的缓存系统,否则我强烈建议您不要这样做。NSURLCache
对于 99.9% 的应用程序来说已经足够了:它处理来自传入响应的缓存指令,并在新请求中适当地使用它们,并且以不太可能成为应用程序性能瓶颈的方式自动执行。作为一个浪费了无数时间自己制作的人(后来因为完全没有必要而把它扔掉了),我想说有更好的地方可以集中你的开发注意力。
我在 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];
不幸的是,这些方法都不适合我。我设法禁用缓存的唯一方法是这样:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
这可能取决于您的服务器实现,但是向Cache-Control:no-store
您的传出请求添加标头应该会导致包含相同标头的响应,从而命令NSURLCache
不将响应缓存到磁盘。
恕我直言,这是一种比完全禁用磁盘缓存更好的方法,特别是如果您正在编写将由其他可能想要使用NSURLCache
.