首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AFNetworking 2.0 -强制缓存

AFNetworking 2.0 -强制缓存
EN

Stack Overflow用户
提问于 2014-08-30 19:59:28
回答 1查看 1.4K关注 0票数 7

如果响应缓存既不包含Expires也不包含Cache-Control: max-age,那么可以强制进行响应缓存吗?

我看到了的文章,但不幸的是,URLSession:dataTask:willCacheResponse:completionHandler:从未在我的AFHTTPSessionManager子类中被调用。

任何帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-26 19:30:48

您可以通过实现不遵循标准HTTP缓存规则的自己的NSURLProtocol来强制缓存。一个完整的教程在这里,它使用核心数据来保存数据,但是基本步骤是:

  • 子类NSURLProtocol
  • 使用+registerClass:注册您的子类
  • 如果这是您第一次看到YES,则在+canInitWithRequest:方法中返回request,如果不是,则返回NO

您现在有两个选择:

  1. 实现您自己的缓存存储(在这种情况下,请遵循上面链接的教程)
  2. 注入您希望URL加载系统遵循的缓存控制头

假设您希望#2,则在您的协议子类中重写connection:didReceiveResponse:以创建一个响应,该响应具有您想要模拟的缓存控制头:

代码语言:javascript
复制
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response {
    // Create a dictionary with the headers you want
    NSMutableDictionary *newHeaders = [response.allHeaderFields mutableCopy];
    newHeaders[@"Cache-Control"] = @"no-transform,public,max-age=300,s-maxage=900";

    // Create a new response
    NSHTTPURLResponse *newResponse = [[NSHTTPURLResponse alloc] initWithURL:response.URL
                                                                 statusCode:response.statusCode
                                                                HTTPVersion:@"HTTP/1.1"
                                                               headerFields:newHeaders];


    [self.client URLProtocol:self
          didReceiveResponse:newResponse
          cacheStoragePolicy:NSURLCacheStorageAllowed];
}

这将导致响应被缓存,就像服务器提供了这些头一样。

对于会话,您需要设置会话配置的protocolClasses。由于您使用的是AFNetworking,所以看起来如下:

代码语言:javascript
复制
[AFHTTPSessionManager sharedManager].session.configuration.protocolClasses = @[[MyURLProtocol class]]

有一些警告,所以请确保您的文档

几个注意事项:

  • 如果有任何方法可以通过让您的服务器发送适当的头来解决这个问题,请改为这样做。
  • 为了简洁起见,我硬编码了"HTTP/1.1",但从技术上讲,您应该将其从响应中提取出来。
  • AFNetworking使用标准的URL加载系统,并且与此问题主要无关。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25586244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档