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