SDWebImage源码学习

以前对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的渲染

总结:查看了源码可以在开发过程汇总更好的使用修改,补充一些东西为自己所用。最重要的感觉是其对整个框架的功能拆分,实现流程,任务记录,回调处理都值得学习借鉴

你可能感兴趣的:(SDWebImage源码学习)