SDWebImage 的缓存原理
1) UIImageView+WebCache 中的setImageWithURL:placeholder... 先显示占位图片, 同时由SDWebImageManager根据URL来在本地查找图片
2) SDImageCache: queryDiskCacheForKey: 用来从缓存中根据Key查找图片, 这个方法很有意思, 会先判断里面传入的参数Key和block参数是否都是空, 如果是返回nil, 写的比较严谨.
3) 如果内存中已经有图片缓存, SDWebImageManager 之前是会回调一个方法didFindImage方法, 现在最新版本的是利用block把图片和缓存类型传出去, 把block传进去,在适当的时候执行block, 把图片显示出来
4)UIImageView + WebCache则会回调SDWebImageManagerDelegate 的这个方法didFinishWithImage的方法来显示图片
5) 如果内存中没有图片缓存, 那么生成NSInvocationOperation添加到队列当中, 从硬盘查找图片是否已被下载缓存
6) 根据URLKey 在硬盘缓存目录下尝试读取图片文件, 这一步NSOperation进行的操作, 所以回主线程结果回调 notifyDelegate:方法
7) 如果上一操作从硬盘读取到了图片, 将图片添加到内存缓存当中(如果空闲较小,会先清空内存缓存)SDImageCacheDelegate回调 didFindImage:方法, 从而展示图片
8) 如果从硬盘缓存目录读取不到图片, 说明所有缓存都不存在该图片, 调用didNotFindImageForKey:图片方法
4\5\6\7步骤现在都已经写在一个block里面了
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 可以预先下载图片, 方便后续使用
如有错误,请批评指正