SDWebImage解析

源码分析

最近,公司的活比较少,所以特地抽出来一点时间,看了一下SDWebImage的源码,并写了这篇文章,查看源码的过程中看了很多相关的文章,总体思路是划分为几个大模块,会分几个博客讲述,下面提供了目录。

目录

SDWebImage的层次结构:

icon

接下来,就按照图片下载的流程来分析一下SDWebImage

图片下载和缓存流程

这一步主要就是跟踪一个图片的下载流程,通过这个流程,我们可以大致的了解SD的图片下载过程中的重要的方法以及处理问题的步骤!

方法过程:

1
2
3
最外层图片下载 可以添加占位图
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options

1
2
3
添加一个对于下载进度的监听的回调,下载完成的回调
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock

1
2
3
4
5
6
7
开始下载(包括查找缓存的过程)
- (id <SDWebImageOperation>)downloadImageWith
URL:(NSURL *)url
options:(SDWebImageOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageCompletionWithFinishedBlock)completedBlock

1
2
查找图片
- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock
1
2
3
从缓存SDImageCache中查找图片
- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key
如果查找到图片
1
2
3
从磁盘中查找图片
- (UIImage *)diskImageForKey:(NSString *)key

1
2
3
4
5
6
7
开始下载
- (id <SDWebImageOperation>)downloadImageWith
URL:(NSURL *)url
options: (SDWebImageDownloaderOptions)options
progress: (SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageDownloaderCompletedBlock)completedBlock

1
2
3
4
5
6
7
添加下载进度的回调
- (void)addProgressCallback: (SDWebImageDownloaderProgressBlock)progressBlock
completedBlock: (SDWebImageDownloaderCompletedBlock)completedBlock
forURL:(NSURL *)url
createCallback:
(SDWebImageNoParamsBlock)createCallback

1
2
3
4
5
6
7
下载的请求
- (id)initWithRequest:(NSURLRequest *)request
options:(SDWebImageDownloaderOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageDownloaderCompletedBlock)completedBlock
cancelled:(SDWebImageNoParamsBlock)cancelBlock

上面是简单的通过对一个图片的下载跟踪过程,整理出来的几个比较重要的方法,图片下载的流程就是-先从缓存中查找看是否已经下载-如果有直接显示,如果没有从磁盘中查找-如果找到现将图片移动到缓存中,在显示图片,如果没有找到开始下载;

在下面对这一步简单描述的各个流程进行简单的细化,过程中可能会存在一些问题,我们能也暂时说不清楚,会用重点的标志标记一下,希望看到这篇文章的同学也可以跟我联系,共同学习;

1、图片的下载

2、图片的缓存

3、缓存管理

4、图片处理

5、多线程方面的注意(待写)