现在经常遇到问到三方原理,比如SDWebImage,涉及哪些关键类,哪些缓存策略等等。这块具体分析加载一个图片原理流程:
1、入口 setimagewithURL:placeholder,会把placeholderImage显示,SDWebImageManager根据URL开始处理图片。
2、进入SDImagecache从缓存中查找图片是否已经下载
3、先从内存图片缓存是否查找是否有图片,如果内存中有图片缓存,SDImageCacheDelegate回调imageCache:didfinishimage到SDWebimageMnager
4、如果内存缓存中没有,生成NSInvocationOperation,添加到队列开始从硬盘查找图片是否已经缓存。
5、根据URLKey 在硬盘缓存目录下尝试读取图片文件。
6、如果上一步从硬盘读取到图片,将图片添加到内存缓存中,SDImagecachedelegate回调didfindImage进而回调展示图片。
7、如果从硬盘缓存目录读取不到图片,说明缓存不存在该图片,需要下载图片。
8、共享或重新生成一个下载器SDWebImageDownloader 开始下载图片
9、图片下载由NSURLConnection来做,实现相关带来判断下载中,下载完成,下载失败。
10、didreceivedata中利用ImageIO做了图片下载进度加载效果。
11、图片下载完以后交给SDWebImageDecoder做图片编码处理。
12、图片解码在一个nsoperationqueue完成,不会拖慢主线程。
13、在主线程notifyDelegate。。。within宣告解码完成 回调给SDWebImageDownloader。
14、回调给ImageDownloader:didfinishimage告知图片下载完成。
15、通知所有downloaddelegate下载完成,回调给需要的地方展示。
16、将图片保存到SDimagecache中。内存缓存和硬盘缓存同时保存。
17、初始化的时候注册一些通知,内存警告或者后台清理内存图片缓存。
18、SDWebImagePrefetcher可以预先下载图片,方便后续使用。