以前对SDWebImage仅仅停留在使用的层面上,没有加以深入了解过。最近工作不是很忙。就对SDWebImage的源码研究学习了一下。感受颇深,尤其是它对整个第三框架的设计,功能划分十分清晰明了。感觉学到了很多东西。
直接来看关键点吧
SDWebImage 图片加载过程
image从上图可以清晰的看到 SDWebImage的整个加载过程
1 首先是外部对象调用sd_setImageWithURL()
2 其内部多次调用后到调用UIView的sd_internalSetImageWithURL()方法。在这个方法内部 首先会去看当前view 是否有正在下载的任务 operation,如果有就取消掉。没有就先创建一个 SDWebImageManager,然后设置下载任务得到一个operation,并保存。
3 SDWebImageManager 会调用其核心方法loadImageWithURL() 在这个方法内部首先会创建一个 SDWebImageCombinedOperation 任务并进行配置。首先会通过imageCache 调用queryDiskCacheForKey()查内存中是否有对应的url缓存,如果有就直接调返回。没有则通过异步再去查询磁盘上是否有。有的话就返回。如果没有则通过SDWebImageDownloader的downloadImage()方法去下载图片。待下载完成进行回调,回调到SDWebImageManager 则使用imageCache 对图片进行缓存操作。
4 然后一步步回调回使用者
接下来看一下 SDWebImage 架构组成
image从上图可以看到它有四个核心模块
Utils
SDWebImageManager:实现图片的下载缓存管理,对外提供方法
SDWebImagePrefetcher:实现图片的预加载
SDWebImageTransition:实现图片加载完毕后的显示动画,支持扩展
Download
SDWebImageDownloader 下载模块 管理下载队列
SDWebImageDownloaderOperation 管理具体的下载任务
Cache
SDImageCache 缓存的各种操作
SDImageCacheConfig 缓存配置信息
Coder
各种解码
SDWebImageCodersManager:图片编码中心,支持拓展
SDWebImageCoder:图片编码协议集,自行拓展的分类必须支持此协议
SDWebImageImageIOCoder:PNG、JPEG、TIFF图片的解码
SDWebImageGIFCoder:GIF的解码
SDWebImageWebPCoder:Webp的解码
SDWebImageFrame:动图设置相关类组合
SDWebImageCoderHelper:图片解码相关帮助方法
SDAnimatedImageRep:NSBitmapImageRep的子类,加快NSBitmapImageRep的渲染
总结:查看了源码可以在开发过程汇总更好的使用修改,补充一些东西为自己所用。最重要的感觉是其对整个框架的功能拆分,实现流程,任务记录,回调处理都值得学习借鉴
网友评论