AFNetworking网络请求iOS性能优化、数据缓存学习

AFNetworking 3.0 image缓存

2016-02-17  本文已影响1413人  Yang152412

1、AFNetworking 3.0 的图片缓存用 NSURLCache 缓存到本地。原来的 AFImageCache 不负责缓存,由AFAutoPurgingImageCache负责缓存到内存。

NSURLCache 会自动在本地 /Library/Caches/com.*.* 目录下生成缓存文件。(image 就在 fsCacheData 目录下)

  1. 当使用 NSURL 相关的框架,使用到缓存的时候,系统会在 Caches目录下创建一个 跟 bundle identifer 同名的一个文件夹,以及里面的 Cache.db、Cache.db-shm、Cache.db-wal
    三个文件和文件夹 fsCacheData/
    ·fsCacheData/ 文件夹会在有需要缓存数据到文件的数据才会有,如缓存图片
  1. 可以使用 [[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,下载图片的时候只判断了有没有内存缓存,如果内存缓存没有读取到图片,就会调用下载逻辑,通过下载缓存的内存缓存硬盘缓存来获取到已下载过的图片,如果没有下载过,就会重新下载。

上一篇下一篇

猜你喜欢

热点阅读