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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容