下载地址:https://github.com/SDWebImage/SDWebImage
一、SDWebImage->1.0版本
2009年发布
没有网络请求,只会在内存当中读取图片以及磁盘中读取 文件。
在1.0时代没有UIView抽象功能(传统代码)
缓存周期为一周
拆分类功能:
UIImageView+WebCache -> 集成了图片下载
SDWebImageManager -> 下载管理器
SDWebImageDownLoader-> 负责下载的功能
SDImageCache->负责缓存
SDWebImageManagerDelegate->图片下载完成
UIViewController->UIImageView(setImageWithURL:)->SDWebImageManager(downloadWithURL)->SDWebImageDownloader(downloaderWithURL)->SDWebImageDownloaderDelegate->SDImageCache
采用了那些设计模式:
1、单例模式:SDWebImageManager SDImageCache
2、外观模式:SDWebImageManager:管理了缓存器、下载器两个核心角色
3、装饰模式:OC的类扩展
4、代理模式:SDWebImageManagerDelegate 、SDWebImageDownloaderDelegate
针对每一个模式的角色分析
UIImageView (WebCache):方法重载:下载图片。调用了SDWebImageManager
SDWebImageManager:下载图片,调用缓存器
SDWebImageDownloader:继承NSOperation,下载器
SDImageCache:保存图片(key:value)url命名
加入缓存:文件名以url MD5编码 命名
缓存读取的顺序:
第一步:内存读取
第二步:缓存(硬盘)读取
第三步:缓存到内存
二、SDWebImage->2.0版本
2010年6月9日发布
注意一:
类结构上没有发生改变,最大的改变增加了网络请求
注意二:
优化一:下载器SDWebImageDownloader->SDWebImageDownloaderDelegate
新增了- (void)imageDownloader:(SDWebImageDownloader *)downloader didFailWithError:(NSError *)error;
优化二:管理器SDWebImageManager->- (void)downloadWithURL:(NSURL *)url delegate:(id<SDWebImageManagerDelegate>)delegate
去掉了同步代码块@synchronized,现在本身是不支持多线程的
优化三:管理器SDWebImageManager->- (void)cancelForDelegate:(id<SDWebImageManagerDelegate>)delegate
去掉了同步代码块@synchronized
优化四: 管理器SDWebImageManager->- (void)imageDownloader:(SDWebImageDownloader *)downloader didFinishWithImage:(UIImage *)image
去掉了同步代码块@synchronized
优化五:下载器SDWebImageDownloader->新增NSURLConnection (delegate)的请求回调
- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
优化六:缓存器-> SDImageCache
新增后台通知
UIDevice *device = [UIDevice currentDevice];
//判断当前是被是否支持多任务
if ([device respondsToSelector:@selector(isMultitaskingSupported)] && device.multitaskingSupported)
{
// When in background, clean memory in order to have less chance to be killed
//当进入后台时清除内存缓存
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearMemory)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
}
三、SDWebImage->2.0-3.0版本之间
2.1版本
主要是功能优化,类结构没变
优化一:UIImageView+WebCache
新增取消图片下载功能 - (void)cancelCurrentImageLoad;
优化二:SDImageCache->缓存器做了优化
兼容iPhone4
增加宏定义 #ifdef __IPHONE_4_0 ... #endif
2.2版本
更新说明:把缓存存储到磁盘时,如果orignal格式是PNG和GIF,不要将图像转换为JPEG,这样可以在所有情况下都能节省CPU和内存以及alpha通道/图像的清晰度
之前存储到磁盘时,无论image是什么格式,直接把image转换成了JPEG的格式,
从2.2版本之后,直接存储数据imageData,没有imageData,
才把image转换成JPEG格式进行存储。
具体看- (void)storeKeyToDisk:(NSString *)key方法
更新一:下载器 ->SDWebImageDownloader
公开@property (nonatomic, retain) NSMutableData *imageData;属性
更新二: 缓存器->SDImageCache
新增 - (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk;
新增属性:NSMutableDictionary *memCache, *storeDataQueue; 存储数据imageData
更新三:代理 -> SDWebImageDownloaderDelegate
新增- (void)imageDownloaderDidFinish:(SDWebImageDownloader *)downloader;
针对于imageData而设计,由客户端实现。 后面版本迭代会更新
具体实现暂时没有,为后面做准备?
2.3版本
更新一:缓存器->代理->SDImageCacheDelegate
//缓存过程中,有图片,缓存成功
- (void)imageCache:(SDImageCache *)imageCache didFindImage:(UIImage *)image forKey:(NSString *)key userInfo:(NSDictionary *)info;
//缓存过程中,没有找到有图片,缓存失败
- (void)imageCache:(SDImageCache *)imageCache didNotFindImageForKey:(NSString *)key userInfo:(NSDictionary *)info;
更新二:UIImageView+WebCache 入口分析
抽象缓存逻辑到管理器中
为什么这么设计?
便有其他UI控件的管理
更新三:管理器 -> SDWebImageManager
注意SDWebImageManager 实现 SDImageCacheDelegate 代理
1.异步检查磁盘上的缓存,这样我们就不会阻塞主线程
2.缓存代理回调的实现 SDImageCacheDelegate
方法一:从回调缓存代理->回调管理器代理->通知客户端结果
- (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.新增了queryDiskCacheOperation方法
目的:检测磁盘缓存,并保存到内存中,并执行notifyDelegate方法
注意:2.3版本网络请求还没有完善
4.新增了notifyDelegate方法
目的:通知所有的缓存代理
2.4版本
首先:分析类结构
新增一:UIButton+WebCache
新增二:SDWebImageCompat
系统版本的兼容(设备、平台兼容)
其次:
先分析入口:
核心线路:UIImageView(入口)->管理器->下载器->缓存器
UIImageView:
没有更新
SDWebImageManager:
1.NSMutableArray *downloadDelegates;存储下载器代理对象(下载多张图片,存在多个代理)
2.NSMutableArray *cacheDelegates;存储缓存器代理对象(缓存多张图片,存在多个代理)
3.- (void)downloadWithURL:(NSURL *)url delegate:(id<SDWebImageManagerDelegate>)delegate retryFailed:(BOOL)retryFailed;
retryFailed:重新下载失败地址
4.SDWebImageManagerDelegate->- (void)webImageManager:(SDWebImageManager *)imageManager didFailWithError:(NSError *)error;
SDWebImageDownloader:
1.新增下载器通知(采用通知的方式进行回调)
SDWebImageDownloadStartNotification:开始下载
SDWebImageDownloadStopNotification:结束下载
2.增加两个属性
id userInfo;用户信息(保存一些公共参数信息)
BOOL lowPriority;下载优先级
3.新增两个方法的重载:
+ (id)downloaderWithURL:(NSURL *)url delegate:(id<SDWebImageDownloaderDelegate>)delegate userInfo:(id)userInfo lowPriority:(BOOL)lowPriority;下载优先级
+ (id)downloaderWithURL:(NSURL *)url delegate:(id<SDWebImageDownloaderDelegate>)delegate userInfo:(id)userInfo;用户信息
SDImageCache:集中在系统的兼容
新增系统平台的兼容->iPhone手机的兼容 #if TARGET_OS_IPHONE