19

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

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

谢谢,阿什利

4

6 回答 6

25

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

Apple 的 URLCache 项目有这样的说法:

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

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

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

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

于 2013-06-12T10:21:19.790 回答
25

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

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

于 2012-04-02T05:43:58.947 回答
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];
于 2012-12-19T11:13:39.513 回答
10

不幸的是,这些方法都不适合我。我设法禁用缓存的唯一方法是这样:

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

这是原始答案

于 2015-02-09T09:15:05.133 回答
0
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
于 2014-07-24T05:54:13.813 回答
0

这可能取决于您的服务器实现,但是向Cache-Control:no-store您的传出请求添加标头应该会导致包含相同标头的响应,从而命令NSURLCache不将响应缓存到磁盘。

恕我直言,这是一种比完全禁用磁盘缓存更好的方法,特别是如果您正在编写将由其他可能想要使用NSURLCache.

于 2017-08-14T21:02:55.483 回答