SDWebImage 的缓存原理缓存
1) UIImageView+WebCache 中的setImageWithURL:placeholder... 先显示占位图片, 同时由SDWebImageManager根据URL来在本地查找图片fetch
2) SDImageCache: queryDiskCacheForKey: 用来从缓存中根据Key查找图片, 这个方法颇有意思, 会先判断里面传入的参数Key和block参数是否都是空, 若是是返回nil, 写的比较严谨.spa
3) 若是内存中已经有图片缓存, SDWebImageManager 以前是会回调一个方法didFindImage方法, 如今最新版本的是利用block把图片和缓存类型传出去, 把block传进去,在适当的时候执行block, 把图片显示出来线程
4)UIImageView + WebCache则会回调SDWebImageManagerDelegate 的这个方法didFinishWithImage的方法来显示图片code
5) 若是内存中没有图片缓存, 那么生成NSInvocationOperation添加到队列当中, 从硬盘查找图片是否已被下载缓存orm
6) 根据URLKey 在硬盘缓存目录下尝试读取图片文件, 这一步NSOperation进行的操做, 因此回主线程结果回调 notifyDelegate:方法队列
7) 若是上一操做从硬盘读取到了图片, 将图片添加到内存缓存当中(若是空闲较小,会先清空内存缓存)SDImageCacheDelegate回调 didFindImage:方法, 从而展现图片图片
8) 若是从硬盘缓存目录读取不到图片, 说明全部缓存都不存在该图片, 调用didNotFindImageForKey:图片方法内存
4\5\6\7步骤如今都已经写在一个block里面了ci
9) 共享或从新生成一个下载器 SDWebImageDownloader开始下载图片回调
如今是SDWebImageDownloaderCompletedBlock下载图片\
10) 图片下载由NSURLConnection来作, 实现相关delegate, 下载完成, 下载中, 下载失败等等
11) didReceiveData 用了imageIO作了下载进度加载效果
12) connectionDidFinishLoadings数据下载完成后交给SDWebImageDecoder作图片解码处理
13) 图片解码处理在一个NSOperationQueue完成, 不会拖慢主线程的UI, 若是有须要对下载好的图片进行二次处理, 最好也在这里, 效率会好不少
14) 在主线程宣告解码完成时, 回调didFinishDecodingImage 方法,给SDWebImageDownloader,
15) imageDownloader didFinishWithImage回调给SDWebImageManager 告知图片下载完成
16) 通知全部的downloadDelegate下载完成了, 回调给须要的地方展现图片,
17) 将图片保存到 SDImageCache中, 内存缓存和磁盘缓存中
18) 写文件到硬盘在单独NSInvocationOperation中进行, 避免拖慢主线程
19) SDImageCache在初始化的时候会注册通知, notification到DidReceiveMemoryWarningNotifacition, 在内存警告的时候, 清理缓存图片
20) SDWebImagePrefetcher 能够预先下载图片, 方便后续使用
若有错误,请批评指正