Ios 如何禁用网络缓存

Ios 如何禁用网络缓存,ios,caching,afnetworking,Ios,Caching,Afnetworking,是否可以禁用AFNetworking的所有缓存功能 我正在构建自己的自定义缓存系统,不希望它也占用磁盘空间 谢谢, Ashley缓存由应用程序范围内的NSURLCache处理。如果未设置共享缓存,则不会缓存请求。即使使用共享的NSURLCache,iOS上的默认实现也不支持磁盘缓存 也就是说,除非您有非常特殊的理由编写自己的缓存系统,否则我强烈建议您不要这样做NSURLCache对于99.9%的应用程序来说已经足够好了:它处理来自传入响应的缓存指令,并在新请求中适当地使用它们,并且以一种不太可能

是否可以禁用AFNetworking的所有缓存功能

我正在构建自己的自定义缓存系统,不希望它也占用磁盘空间

谢谢,
Ashley

缓存由应用程序范围内的
NSURLCache
处理。如果未设置共享缓存,则不会缓存请求。即使使用共享的
NSURLCache
,iOS上的默认实现也不支持磁盘缓存


也就是说,除非您有非常特殊的理由编写自己的缓存系统,否则我强烈建议您不要这样做
NSURLCache
对于99.9%的应用程序来说已经足够好了:它处理来自传入响应的缓存指令,并在新请求中适当地使用它们,并且以一种不太可能成为应用程序性能瓶颈的方式自动执行。作为一个浪费了无数时间自己制作一个的人(后来因为它完全没有必要而扔掉了),我要说的是,有更好的地方可以集中你的开发注意力。

我在iOS 6上发现,请求有时会被缓存,即使请求有
nsurlRequestReloadingCacheData
。添加返回
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];

起初我发现Jason Moore的答案是可行的,但最近我注意到我的应用程序仍在缓存请求。我没有使用最新的AFNetworking,所以我不知道在最近的版本中是否已经解决了缓存问题

苹果的URLCache项目有这样一句话:

默认情况下,Cocoa URL加载系统使用一个小的共享内存 隐藏物我们不需要这个缓存,所以当 应用程序启动

然后执行此操作以禁用缓存

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

这将禁用整个应用程序的所有缓存,这在某些情况下可能并不理想,但由于
NSURLRequest
不遵守请求的缓存策略,这是我可以看到的唯一选项。

不幸的是,这些方法中没有一种对我有效。我成功禁用缓存的唯一方法是:

NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

这可能取决于您的服务器实现,但在传出请求中添加
缓存控制:no store
头将导致包含相同头的响应,从而命令
NSURLCache
不将响应缓存到磁盘


IMHO这是一种比完全禁用磁盘缓存更好的方法,特别是如果您正在编写SDK代码,这些代码将被其他可能希望利用
NSURLCache

的应用程序使用,那么还有什么方法禁用它吗?我真的需要这个,因为我的缓存系统是有点非正统无论如何。必须禁用缓存,这是一个真正的问题。默认情况下,它是关闭的。您必须通过创建
NSURLCache
并将其设置为共享缓存来选择加入。它已经存在了吗?目前,它看起来将为您自动生成。我认为,
AFImageCache
并不是OP所说的缓存。如果是这样的话,我想解决办法是不要使用
UIImageView
类别。我在下面的博文中介绍了这一点-谢谢!我支持这个。谢谢你的解决方案!对于使用
AFHTTPClient
,我们应该用方法:path:parameters覆盖
requestWithMethod
。调用super方法获取
NSURLRequest
,然后说
request.cachePolicy=nsurlRequestReloadingLocalAndRemoteCacheData能否修复代码段中错误的枚举类型?任何人如果没有注意到有两个更新,都会错过引导。将缓存策略设置为NSURLCacheStorageNotAllowed是不正确的。您使用的是NSURLCacheStoragePolicy值,而不是NSURLRequestCachePolicy。实际上,您将其设置为NSURLRequestReturnCacheDataElseLoad,其值(2)与NSURLCacheStorageNotAllowed相同。我刚刚更新了答案以删除不正确的枚举。抱歉造成混淆-显然编辑答案比添加更新更好!甚至在AFnetworking中对我也有效-缓存破坏了从https服务恢复的下载…我有一个单例来管理后端调用。我把这两行代码放在我的init方法中,它们都很好地工作!