之前只知道如何使用,如今我想进阶一下知道他的原理,要知其然,更要知其因此然。前端
SDWebimage实现简单的步骤以下:
缓存
1.在显示图片以前,先检查内存缓存中时候有该图片;bash
2.若是内存缓存中有图片,那么就直接使用,不下载;学习
4.若是磁盘缓存中有图片,那么直接使用,还须要保存一份到内存缓存中(方便下一次使用);url
5.若是磁盘缓存中无图片,那么再去下载,而且把下载完的图片保存到内存缓存与磁盘缓存中。spa
根据咱们的步骤,跳进SDWebimage的源码看看,咱们调用的是以下这个方法:code
[self.imageView sd_setImageWithURL:[NSURL URLWithString:model.thumb_url?:@""] placeholderImage:[UIImage imageNamed:@""]];复制代码
一步步进入到以下方法中:cdn
经过下图咱们能够清楚的看到:第一步判断的是图片是否存在,初始化SDWebImageManagerblog
再判断SDImageCache中是否存在图片,若是存在则调用sdImageCacheDelegate返回到前端显示;若是没有在SDImageCache中找到图片,则生成NSInvocationOperation添加到队列中,在磁盘中查找,找到则回调;没找到,则共享或生成下载器SDWebImageDownLoader开始下载图片,由NSURLConnection来执行,下载完毕后图片解码在NSOperationQueue中执行,在notifyDelegateOnMainThreadWithInfo中告诉解码完成
队列
progressblock中也能够看到下载的进度,
在这里显示进度和是否下载完毕:
通知全部的 downloadDelegates 下载完成,回调给须要的地方展现图片。
图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。
看完以后真是膜拜大神,这只是简单的实现过程,尚未查看各个分类具体的操做。之后有时间在,好好研究一下各个分类的处理。在看其余博客的时候,看到一个流程解释很全面的图,附上:
SDWebImage还有不少值得咱们借鉴和学习的地方,须要你们细细研读,更深层次的学习它内部处理的思路。之后本身理解深刻了,再作一些详细的介绍。