如果你已经使用AFNetworking作为你的http网络框架,就没必要自己实现缓存机制了,直接配置就可以了:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.cachePolicy = NSURLRequestReloadRevalidatingCacheData;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",nil];
[manager GET:@"https://www.baidu.com/"
parameters:nil
progress:nil
success:^(NSURLSessionDataTask * _Nonnull task,
id _Nullable responseObject) {
NSLog(@"%@", responseObject);
}
failure:^(NSURLSessionDataTask * _Nullable task,
NSError * _Nonnull error) {
}];
可以有以下选择:
-
NSURLRequestUseProtocolCachePolicy
NSURLRequest 默认的cache policy,使用Protocol协议定义。 -
NSURLRequestReloadIgnoringCacheData
忽略缓存,直接从原始地址下载,用于实时数据。 -
NSURLRequestReturnCacheDataDontLoad
只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式。 -
NSURLRequestReturnCacheDataElseLoad
只有在cache中不存在data时才从原始地址下载,适用一些不太会变化的数据。
注意以下策略是未实现的:
-
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。 -
NSURLRequestReloadRevalidatingCacheData
验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
可以通过时间戳比对等方法自行实现,需要服务端配合。