SDWebImage源码分析(二)
一: 2.0版本增加网络请求:
//开始请求
- (void)start;
//取消请求
- (void)cancel;
二: 增加网络请求后, 整体功能进行了优化
1: 下载器->SDWebImageDownloaderDelegate
新增了didFailWithError方法重载
2: 管理器->SDWebImageManager->downloadWithURL方法
3: 管理器->SDWebImageManager->cancelForDelegate
4: 管理器->SDWebImageManager->didFinishWithImage->下载成功回调
管理器实现了SDWebImageDownloaderDelegate协议
5: 下载器->SDWebImageDownloader->请求回调
增加didReceiveData、connectionDidFinishLoading、didFailWithError
6: 缓存器->SDImageCache,
新增后台通知
UIApplicationDidEnterBackgroundNotification
当我们按下返回键(后台模式->清空内存缓存) (因为手机内存比较小, 如果不及时释放内存, 容易导致卡死)
更新说明:
如果图片格式是PNG或GIF,当存储到磁盘进行缓存时候,不要将图像转换为JPEG,因为他能够节省CPU和内存以及alpha通道/图像的清晰度。
更新一:下载器->SDWebImageDownloader
@property (nonatomic, retain) NSMutableData *imageData;//图片数据
将下载到的图片data拼接到imageData中,然后在代理回调中传递
更新二:缓存器->SDImageCache
新增了方法重载
- (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk;
新增了属性, NSMutableDictionary *storeDataQueue;
增加了二进制NSData数据存储->磁盘
更新三:代理->SDWebImageDownloaderDelegate
新增了回调imageDownloaderDidFinish
缓存代理
1、异步检查磁盘上的缓存,这样我们就不会阻塞主线程
2、缓存代理回调实现
方法一:
- (void)imageCache:(SDImageCache *)imageCache didFindImage:(UIImage *)image forKey:(NSString *)key userInfo:(NSDictionary *)info;
方法二:
- (void)imageCache:(SDImageCache *)imageCache didNotFindImageForKey:(NSString *)key userInfo:(NSDictionary *)info;
从回调缓存代理->回调管理器代理->通知客户端结果
更新四:缓存器->SDImageCache
1、新增了属性(读写都不能够影响主线程->阻塞)
NSOperationQueue *cacheOutQueue;
目的:避免阻塞主线程
2、新增异步读取缓存方法
queryDiskCacheForKey
两个缓存:内存缓存、磁盘缓存
读取是耗时操作
3、新增了notifyDelegate方法
目的:通知所有的缓存代理
4、新增了queryDiskCacheOperation方法