如何禁用AFNetworking缓存

19

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

我正在构建自己的自定义缓存系统,不想将其占用磁盘空间。

谢谢, Ashley

6个回答

25

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

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


3
还有什么方法可以禁用它吗?我的缓存系统本来就有点不规范,所以非常需要禁用缓存。禁用缓存是必须的。 - Ashley Staggs
默认情况下它是关闭的。您需要通过创建NSURLCache并将其设置为共享缓存来选择加入。 - mattt
4
已经是这样了吗?目前看起来它将会为您自动生成。https://github.com/AFNetworking/AFNetworking/blob/experimental-1.0RC1/AFNetworking/UIImageView%2BAFNetworking.m#L70 - steipete
我认为AFImageCache并不是OP所说的缓存的真正意思。如果是这种情况,解决方案就是不使用UIImageView类别,我猜测。 - mattt
我在以下博客文章中涵盖了这个问题 - 谢谢!http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/ - vfxdrummer
@mattt,你对这个问题有什么想法吗?我正在使用AFNetworking,到目前为止它一直表现得非常出色,但我不确定我的问题是否与你的库有关。我已将cachePolicy设置为忽略本地和远程缓存。 - Cameron Askew

25

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

苹果的URLCache项目有以下说明:

默认情况下,Cocoa URL加载系统使用一个小的共享内存缓存。我们不需要这个缓存,因此在应用程序启动时将其设置为零。

然后执行以下操作以禁用缓存。

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

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


1
即使在使用AFnetworking时遇到了缓存损坏的问题,该方法仍然对我有效。它可以从https服务中恢复下载... - PetrV

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];

我赞同这个观点。感谢您提供的解决方案! - Firefly
4
要使用 AFHTTPClient,我们应该重写 requestWithMethod:path:parameters 方法。调用父类方法以获取 NSURLRequest 并设置 request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData; - Yeung
你能否修复代码片段中错误的枚举类型?如果没有注意到有两个更新,这会误导任何人。 - Greg Wang
将缓存策略设置为NSURLCacheStorageNotAllowed是不正确的。您正在使用NSURLCacheStoragePolicy值而不是NSURLRequestCachePolicy。实际上发生的是,您将其设置为NSURLRequestReturnCacheDataElseLoad,它具有与NSURLCacheStorageNotAllowed相同的值(2)。 - Maciej Swic
我刚刚更新了答案,删除了错误的枚举。对于造成的困惑,我感到抱歉 - 显然编辑答案比添加更新更好! - Jason Moore
根据NSURLRequest头文件,NSURLRequestReloadIgnoringLocalAndRemoteCacheData未实现,因此我不会依赖它。您可能想使用NSURLRequestReloadIgnoringLocalCacheData代替。 - Michael Long

10

很不幸,这些方法都没能对我奏效。我唯一成功禁用缓存的方式是:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

这是原始回答


我有一个单例来管理后端调用。我将这两行代码放在我的初始化方法中,一切都运作良好! - Zeb

0
这可能取决于您的服务器实现,但将 Cache-Control:no-store 标头添加到您的传出请求中应该会导致响应包含相同的标头,从而命令 NSURLCache 不要将响应缓存到磁盘中。
在我看来,这比完全禁用磁盘缓存更好,特别是如果您正在编写将由其他可能希望利用 NSURLCache 的应用程序使用的 SDK 代码。

0
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接