AFNetworking 3.0 image缓存
1、AFNetworking 3.0 的图片缓存用 NSURLCache 缓存到本地。原来的 AFImageCache 不负责缓存,由AFAutoPurgingImageCache负责缓存到内存。
NSURLCache 会自动在本地 /Library/Caches/com.*.* 目录下生成缓存文件。(image 就在 fsCacheData 目录下)
- 当使用 NSURL 相关的框架,使用到缓存的时候,系统会在 Caches目录下创建一个 跟 bundle identifer 同名的一个文件夹,以及里面的 Cache.db、Cache.db-shm、Cache.db-wal
三个文件和文件夹 fsCacheData/
·fsCacheData/ 文件夹会在有需要缓存数据到文件的数据才会有,如缓存图片
- 可以使用 [[NSURLCache sharedURLCache] removeAllCachedResponses] 清理这里所有的缓存数据。
2、 2.* 版本的 AFImageCache 继承自 NSCache,负责 内存和 disk 缓存。3.* 版本 AFImageCache 继承自 NSObject,只负责持有 image 和 image 的内存大小,为 AFAutoPurgingImageCache 服务,AFAutoPurgingImageCache 负责缓存到内存。
这个策略和 Swift 版本的 AFNetworking Alamofire 中的 AlamofireImage保持一致。
3、AFAutoPurgingImageCache 负责内存缓存,NSURLCache 负责硬盘缓存,所以 通过 AFImageDownloader 的 imageCache - (nullable UIImage *)imageforRequest:(NSURLRequest *)request withAdditionalIdentifier:(nullable NSString *)identifier;
方法是读不到 硬盘缓存的图片的,只能通过 NSURLCache 去获得
+ (UIImage *)dd_cachedImageForRequest:(NSURLRequest *)request
{
AFImageDownloader *downloader = [AFImageDownloader defaultInstance];
// 内存缓存
UIImage *cachedImage = [downloader.imageCache imageforRequest:request withAdditionalIdentifier:nil];
if (!cachedImage) {
// 内存缓存没有,读取硬盘缓存
NSURLCache *urlCache = downloader.sessionManager.session.configuration.URLCache;
NSCachedURLResponse *cacheResponse = [urlCache cachedResponseForRequest:request];
if (cacheResponse.data) {
cachedImage = [UIImage imageWithData:cacheResponse.data];
}
}
return cachedImage;
}
4、AFImageDownlder,下载图片的时候只判断了有没有内存缓存,如果内存缓存没有读取到图片,就会调用下载逻辑,通过下载缓存的内存缓存硬盘缓存来获取到已下载过的图片,如果没有下载过,就会重新下载。