AFNetworking中setImageWithURLRequest重启APP后无法使用磁盘缓存问题
AFNetworking 图片磁盘缓存不生效问题解决方案
核心原因
- AFNetworking 的
UIImageView+AFNetworking分类默认使用的AFImageCache仅实现内存缓存,没有自带磁盘缓存能力。APP 重启后内存缓存自动释放,再次请求就会重新走网络流程。 - 你配置的全局
NSURLCache是 NSURL 层的通用缓存,只有当 AF 的内存缓存未命中、发起实际网络请求时才会生效。而NSURLCache要写入磁盘缓存,要求服务端返回的 HTTP 响应头包含合法的缓存控制字段(Cache-Control/Expires/Etag等),如果服务端没有配置允许持久化缓存的头,即使你设置了磁盘容量,缓存也不会落地存储。 - 你判断缓存命中的逻辑是准确的:AF 回调中
response == nil代表命中了自身的内存缓存,若命中NSURLCache的磁盘缓存,回调的response依然会有值,不会触发你的缓存日志。
可行解决方案
方案1:强制开启NSURLCache磁盘缓存
如果不想修改AF的默认逻辑,可通过实现NSURLSession的代理方法,手动强制存储响应到磁盘缓存,忽略服务端的缓存头限制:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask willCacheResponse:(NSCachedURLResponse *)proposedResponse completionHandler:(void (^)(NSCachedURLResponse * _Nullable))completionHandler { NSMutableDictionary *mutableUserInfo = [proposedResponse.userInfo mutableCopy]; NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response data:proposedResponse.data userInfo:mutableUserInfo storagePolicy:NSURLCacheStorageAllowed]; completionHandler(cachedResponse); }
方案2:自行实现磁盘缓存逻辑
在图片下载成功的回调中,手动将图片写入沙盒的Library/Caches目录,下次请求时优先按URL的MD5值作为key读取本地磁盘缓存,再走网络请求:
// 写缓存示例 - (void)saveImageToDisk:(UIImage *)image forURL:(NSURL *)url { NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *fileName = [url.absoluteString md5String]; // 需要自己实现NSString的MD5分类 NSString *fullPath = [cachePath stringByAppendingPathComponent:fileName]; [UIImagePNGRepresentation(image) writeToFile:fullPath atomically:YES]; }
方案3:替换图片加载组件
如果业务允许,可直接替换为SDWebImage等自带内存+磁盘两级缓存的图片加载组件,无需自行处理缓存逻辑。
内容的提问来源于stack exchange,提问作者Zhou Haibo
相关产品推荐
相关产品推荐

