使用 AFNetwork 2.0 管理缓存映像



我用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 这将忽略缓存的数据并下载新映像。

最新更新