ios - 如何设置 NSURLRequest 缓存过期?

标签 ios objective-c caching

我正在使用 AFNetworking,需要在一个响应中缓存数据几分钟。所以我在应用程序委托(delegate)中设置 NSUrlCache,然后在我的请求中设置它:

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

然后如何设置过期日期:如果数据是在超过 n 分钟前加载的,则请求服务器而不是磁盘的响应?

编辑:

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

最佳答案

所以,我找到了解决方案。

想法是使用connection:willCacheResponse: 方法。在缓存响应之前,它将被执行,我们可以在那里更改响应并返回新的,或者返回 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 header 中设置以秒为单位的过期时间 为此,我们需要设置其中一个 header : 过期,缓存控制:s-maxage 或 max-age 然后创建新的缓存响应,因为属性是只读的,并返回新的对象。

关于ios - 如何设置 NSURLRequest 缓存过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855280/

相关文章:

google-app-engine - 旧版本文件仍然出现在谷歌应用引擎中

c++ - 使用 cocoapods 在 iOS 上集成 GoogleCloudMessaging

ios - 如何在 ViewController 及其 NavigationController 上添加 UIview

java - 当我想要简单的持久性时,是否需要从 2.6 降级到 EhCache 2.5?

node.js - 将图像缓存到文件系统并将图像传输到响应

objective-c - iOS - 不断更新方法

iOS Push UIViewController 像 Snapchat 这样的滑动手势

ios - UIToolbar 子类化不起作用

ios - nil 不是合法的 NSManagedObjectContext 参数

objective-c - 邮件发送失败