最近,公司的活比较少,所以特地抽出来一点时间,看了一下SDWebImage的源码,并写了这篇文章,查看源码的过程中看了很多相关的文章,总体思路是划分为几个大模块,会分几个博客讲述,下面提供了目录。
目录
SDWebImage的层次结构:
接下来,就按照图片下载的流程来分析一下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
|
上面是简单的通过对一个图片的下载跟踪过程,整理出来的几个比较重要的方法,图片下载的流程就是-先从缓存中查找看是否已经下载-如果有直接显示,如果没有从磁盘中查找-如果找到现将图片移动到缓存中,在显示图片,如果没有找到开始下载;
在下面对这一步简单描述的各个流程进行简单的细化,过程中可能会存在一些问题,我们能也暂时说不清楚,会用重点的标志标记一下,希望看到这篇文章的同学也可以跟我联系,共同学习;
5、多线程方面的注意(待写)