SDWebImage

下载地址: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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容