如何设置NSURLRequest缓存过期?

HotJard

我正在使用AFNetworking,需要在一个响应中缓存数据几分钟。因此,我在应用程序委托中设置了NSUrlCache,然后在我的请求中对其进行了设置:

NSMutableURLRequest *request = //obtain request; 
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

然后如何设置到期日期:如果数据加载时间超过n分钟,请询问服务器的响应而不是磁盘的响应?

编辑:

假设服务器不支持缓存,我需要用代码进行管理。

HotJard

因此,我找到了解决方案。

这个想法是使用connection:willCacheResponse:方法。在缓存响应之前,它将被执行,我们可以在其中更改响应并返回new,或者返回nil,并且响应不会被缓存。当我使用AFNetworking时,有一个很好的操作方法:

- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block;

添加代码:

  [operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) {
      cachedResponse = [cachedResponse responseWithExpirationDuration:60];
    }
    return cachedResponse;
  }];

responseWithExpirationDuration来自哪里

@interface NSCachedURLResponse (Expiration)
-(NSCachedURLResponse*)responseWithExpirationDuration:(int)duration;
@end

@implementation NSCachedURLResponse (Expiration)

-(NSCachedURLResponse*)responseWithExpirationDuration:(int)duration {
  NSCachedURLResponse* cachedResponse = self;
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response];
  NSDictionary *headers = [httpResponse allHeaderFields];
  NSMutableDictionary* newHeaders = [headers mutableCopy];

  newHeaders[@"Cache-Control"] = [NSString stringWithFormat:@"max-age=%i", duration];
  [newHeaders removeObjectForKey:@"Expires"];
  [newHeaders removeObjectForKey:@"s-maxage"];

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

  cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:newResponse
                                                            data:[cachedResponse.data mutableCopy]
                                                        userInfo:newHeaders
                                                   storagePolicy:cachedResponse.storagePolicy];
  return cachedResponse;
}

@end

因此,我们根据http / 1.1在http标头中设置了以秒为单位的到期时间,为此,我们需要设置标头之一:Expires,Cache-Control:s-maxage或max-age然后创建新的缓存响应,因为属性为只读,并返回新对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何设置NSURLRequest缓存过期?

来自分类Dev

绕过HTTP响应标头Cache-Control:如何设置缓存过期时间?

来自分类Dev

如何在 Phoenix 框架上设置浏览器缓存和过期标头?

来自分类Dev

如何使Rails条件GET缓存过期?

来自分类Dev

休眠如何处理缓存过期?

来自分类Dev

NSURLRequest缓存策略枚举

来自分类Dev

NSURLRequest缓存策略枚举

来自分类Dev

如何设置Mod的字体过期

来自分类Dev

如何设置不过期的令牌

来自分类Dev

如何设置Mod的字体过期

来自分类Dev

将“缓存Redis过期”设置为1年

来自分类Dev

在Rails / Cloudfront / Heroku中设置资产缓存过期

来自分类Dev

如何设置缓存控制

来自分类Dev

NSURLRequest缓存问题iOS 7

来自分类Dev

如何获取laravel(文件)缓存的密钥过期时间?

来自分类Dev

如何防止Redis中的缓存覆盖过期时间

来自分类Dev

如何在缓存条目过期之前对其进行处理?

来自分类Dev

如何获取laravel(文件)缓存的密钥过期时间?

来自分类Dev

Nginx缓存:如何根据请求日期过期/变化

来自分类Dev

Redis:如何设置过期更新列表

来自分类Dev

如何设置Big Query表的过期时间?

来自分类Dev

如何设置电子邮件过期?

来自分类Dev

部分缓存过期

来自分类Dev

如何设置DNS缓存时间?

来自分类Dev

Spring Boot本机缓存:如何通过单个键/元素过期/删除缓存数据

来自分类Dev

Rails 4片段缓存整个页面。如何使模型中的缓存过期

来自分类Dev

如何使用和设置过期设置权限共享?

来自分类Dev

使用 Cyberduck 将缓存过期标头设置为 S3 文件

来自分类Dev

Laravel永久缓存*可能*过期