iOS开发之SDWebImage解析

SDWebImage下载地址:https://github.com/rs/SDWebImage

1.SDWebImage简介

SDWebImage能够添加网络图像和缓存管理到Cocoa Touch framework的UIImageView类别,具有异步图像下载、支持GIF动画、支持WebP格式、后台图像解压等特征,保证相同的url不会下载多次、伪造的URL不会尝试一遍又一遍的下载、主线程永远不会被阻塞等。

2.SDWebImage体系结构

iOS开发之SDWebImage解析_第1张图片
SDWebImage类图
iOS开发之SDWebImage解析_第2张图片
SDWebImage序列图

3.UIImageView+WebCache

图片下载

第一个参数:图片的url
第二个参数:占位图片缓存处理

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
图片的下载进度

第一个参数:图片的url
第二个参数:占位图片
第三个参数:下载图片的选项(策略)
第四个参数:progress进度回调
receivedSize:已经下载的图片大小
expectedSize:图片的总大小

第五个参数:completed 下载完成(成功|失败)之后的回调
image:要下载的图片,如果错误的话,那么image = nil
error:错误信息,如果错误的话 那么这个error有值
cacheType:缓存的类型
imageURL:图片的url

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock

4.SDWebImageManager

第一个参数:图片的url
第二个参数:下载图片的选项
第三个参数:progress进度回调
receivedSize:已经下载的图片大小
expectedSize:图片的总大小

第四个参数:completed 下载完成(成功|失败)之后的回调
image:要下载的图片,如果错误的话,那么image = nil
error:错误信息,如果错误的话 那么这个error有值
cacheType:缓存的类型
imageURL:图片的url

-(id )downloadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionWithFinishedBlock)completedBlock

5.UIImage+GIF

播放本地的gif

原理解析
(1)把用户传入的gif图片转换为二进制数据流NSData
(2)调用系统
+(UIImage *)sd_animatedGIFWithData:(NSData *)data
a.系统方法根据NSData创建一个图片数据源
b.计算数据源中一共有多少帧,把每一帧数据取出放到图片数组中
c.根据得到的数组和计算好的动画时间得到动画
animatedImage = [UIImage animatedImageWithImages:images duration:duration];

+(UIImage *)sd_animatedGIFNamed:(NSString *)name

6.SDWebImageDownloader和UIImage+GIF

下载gif图片

(1)创建SDWebImageDownloader的单例对象

+(SDWebImageDownloader *)sharedDownloader

(2)SDWebImageDownloader单例对象调用下面方法下载gif
第一个参数:图片的url
第二个参数:下载图片的选项(策略)
第三个参数:progress进度回调
receivedSize:已经下载的图片大小
expectedSize:图片的总大小

第四个参数:completed 下载完成(成功|失败)之后的回调
image:要下载的图片,如果错误的话,那么image = nil
error:错误信息,如果错误的话 那么这个error有值
cacheType:缓存的类型
SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
SDImageCacheTypeDisk:磁盘缓存
SDImageCacheTypeMemory:内存缓存
imageURL:图片的url

-(id )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock

(3)在completed中调用下面方法显示gif图片

+(UIImage *)sd_animatedGIFWithData:(NSData *)data

7.SDWebImage图片加载的流程

(1)入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片;
(2)进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo: 交给 SDImageCache 从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:;
(3)先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存, SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager;
(4)SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片;
(5)如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存;
(6)根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:;
(7)如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片;
(8)如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:;
(9)共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片;
(10)图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败;
(11)connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果;
(12)connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理;
(13)图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多;
(14)在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader;
(15)imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成;
(16)通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片;
(17)将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程;
(18)SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片;
(19)SDWebImage 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用;
(20)SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

>######最常用的SDWebImage接口调用

[self.imageView sd_setImageWithURL:[NSURL URLWithString:@"url"] placeholderImage:[UIImage imageNamed:@"placeholder"]];


####8.缓存的处理方式:NSCache
>在缓存中设置指定键名对应的值

-(void)setObject:(ObjectType)obj forKey:(KeyType)key

>在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素

-(void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g

>删除缓存中指定键名的对象

-(void)removeObjectForKey:(KeyType)key

>删除缓存中所有的对象

-(void)removeAllObjects

你可能感兴趣的:(iOS开发之SDWebImage解析)