SDWebImage源码解读

318 阅读2分钟

以前只知道如何使用,现在我想进阶一下知道他的原理,要知其然,更要知其所以然。

SDWebimage实现简单的步骤如下:

1.在显示图片之前,先检查内存缓存中时候有该图片;

2.如果内存缓存中有图片,那么就直接使用,不下载;

3.如果内存缓存中无图片,那么再检查是否有磁盘缓存;

4.如果磁盘缓存中有图片,那么直接使用,还需要保存一份到内存缓存中(方便下一次使用);

5.如果磁盘缓存中无图片,那么再去下载,并且把下载完的图片保存到内存缓存与磁盘缓存中。


根据我们的步骤,跳进SDWebimage的源码看看,我们调用的是如下这个方法:

[self.imageView sd_setImageWithURL:[NSURL URLWithString:model.thumb_url?:@""] placeholderImage:[UIImage imageNamed:@""]];

一步步进入到如下方法中:


通过下图我们可以清楚的看到:第一步判断的是图片是否存在,初始化SDWebImageManager


再判断SDImageCache中是否存在图片,如果存在则调用sdImageCacheDelegate返回到前端显示;如果没有在SDImageCache中找到图片,则生成NSInvocationOperation添加到队列中,在磁盘中查找,找到则回调;没找到,则共享或生成下载器SDWebImageDownLoader开始下载图片,由NSURLConnection来执行,下载完毕后图片解码在NSOperationQueue中执行,在notifyDelegateOnMainThreadWithInfo中告诉解码完成


progressblock中也可以看到下载的进度,



在这里显示进度和是否下载完毕:

通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。

看完之后真是膜拜大神,这只是简单的实现过程,还没有查看各个分类具体的操作。以后有时间在,好好研究一下各个分类的处理。在看其他博客的时候,看到一个流程解释很全面的图,附上:


SDWebImage还有很多值得我们借鉴和学习的地方,需要大家细细研读,更深层次的学习它内部处理的思路。以后自己理解深入了,再做一些详细的介绍。