我用AFNetworking 2.0将一些图像加载到我的应用程序中。默认情况下,它会缓存它。我不想总是从缓存中加载图像。仅当 Web 图像和缓存的图像不同时,我才想从缓存中加载图像。那我该怎么做呢?
我的代码:
AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];
requestOperation.responseSerializer = [AFImageResponseSerializer serializer];
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Response: %@", responseObject);
_imageView.image = responseObject;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Image error: %@", error);
}];
[requestOperation start];
处理缓存的正确方法是修改服务器的cache-control
标头,以描述客户端应缓存给定资源的时间。 URL 基础加载系统将遵循服务器提供的标头。
除非你有很好的理由在客户端禁用内置缓存机制,否则你不应该这样做 - 在 99% 的情况下,这会让你的应用变慢,因为在许多情况下,你的应用可能会尝试获取相同的资源。
如果需要覆盖它们的客户端,请对应用中使用的 AFNetworking 请求序列化程序进行子类化,并在它们返回的 NSMutableURLRequest 上设置cachePolicy
。 然后将此请求序列化程序分配给请求操作管理器或会话管理器。
创建NSURLRequest
时需要指定cachePolicy
。
+ (id)requestWithURL:(NSURL *)theURL
cachePolicy:(NSURLRequestCachePolicy)cachePolicy
timeoutInterval:(NSTimeInterval)timeoutInterval
cachePolicy 的值应为 NSURLRequestUseProtocolCachePolicy。
NSURLRequestUseProtocolCachePolicy
指定协议中定义的缓存逻辑 实现(如果有)用于特定的 URL 加载请求。 这是 URL 加载请求的默认策略。
还应确保响应包含Cache-Control
HTTP
标头。此标头必须存在于服务器的响应中,才能使客户端启用HTTP
缓存。
如果您仍然获得缓存的图像,这意味着服务器只是在标头Cache-Control
HTTP
告诉您使用缓存。这应该很容易在服务器端更改。但是,有时您无权访问服务器。在这种情况下,您可以回退到使用 NSURLRequestReloadIgnoringLocalCacheData
这将忽略缓存的数据并下载新映像。