我正在使用AFNetworking,需要在一个响应中缓存数据几分钟。因此,我在应用程序委托中设置了NSUrlCache,然后在我的请求中对其进行了设置:
NSMutableURLRequest *request = //obtain request;
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
然后如何设置到期日期:如果数据加载时间超过n分钟,请询问服务器的响应而不是磁盘的响应?
编辑:
假设服务器不支持缓存,我需要用代码进行管理。
因此,我找到了解决方案。
这个想法是使用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] 删除。
我来说两句