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