之前面试,让你说说对SDWebImage的理解,其实之前有看过这个库的代码,但是年代久远了,而且当时对代码的理解力有点偏差,有点遗忘了,现在再重新看这个库的代码,又查了查,参看了一些博客,现在总结一下
参考博客:http://draveness.me/ios-yuan-dai-ma-jie-xi-sdwebimage/
截图是对第三方库的整个文件的展示,这里面主要的是Downloader、Cache、Utils和Categories四部分
Categories包括若干个分类,其实分类,我总结是一种扩充的存在形式,在某个类不可修改或者不想修改的情况下,我们添加分类达到来扩充的目的,让这个类有一些我们想要的方法。相比较继承形式,分类其实还是原类,而继承却形成了新的类。
话题有点远
其实我们在使用的时候最常用的是sd_setImageWithURL:placeholderImage:方法
输入下载图片的url和替换图片,而他在调用sd_setImageWithURL:placeholderImage:options:progress:completed:方法。而此方法有三个功能:
1.放弃现在的Image下载
2.设置替代图片
3.设置下载operation并且存储起来
主要讲一下下载的operation,它其实主要涉及一个SDWebImageManager和SDWebImageOperation俩个相关的类(PS:其实我觉得下载图片和下载视频其实是一件挺相似的事情,只是视频下载数据量大一点而已。而且如果我们去看一下那些主流的视频软件,他们通常是把视频剪成很多段,然后分段下载和使用。而之前我问个别人这样的问题,假如要下载大量的视频,你该怎样做,很多人都说就放到GCD中下载就行了,我觉得这样做很鸡肋,难道你不需要对你的下载的视频操作任务进行管理吗,如果用户要删除正在下载的视频呢?所以在SDWebImage实际上是形成了一个下载operation,然后存储起来,所以下载任务的设置和正在下载功能的设置是分开的,而这个UIImageView+WebCache分类很明显只是设置了下载任务并且存储起来,也就是将某个url的下载任务放到了一个下载池里面。)
SDWebImageManager类其实是一个单例方法。
其中最主要的下载方法是downloadImageWithURL:options:progress:completed:也就是SDWebImage的核心功能区域,他既要实现图片下载,又要把下载的图片缓存起来,具体怎么实现,想了解的人可以具体看一下代码。
当然,图片的下载和缓存都是涉及到方方面的,所以在SDWebImageManager有俩个SDWebImageDownloader和SDImageCache类属性,这才是真正的下载和缓存功能代码区域。而SDWebImageManager实际上是联系这俩者的桥梁,即SDWebImageManager调度SDWebImageDownloader和SDImageCache形成图片的下载和缓存的operation,而UIImageView+WebCache通过调度SDWebImageManager方法设置获取下载的图片
我觉得核心就是我上面讲的东西。
SDWebImageDownloader
如图中解释,这个类实现了图片的异步下载和加载优化
核心代码在downloadImageWithURL:options:progress:completed:中
所以我总结起来这个类是对下载的一个高度抽象
SDImageCache
如图中解释,它就是管理内存缓存和硬盘缓存的。而硬盘缓存写入任务是异步执行的,所以他不会延迟UI.
SDWebImageDownloaderOperation继承自NSOperation,形成下载任务方便存储起来,方便之后执行。所以其实整个这个图片下载还运用了NSOperation和NSOperationQueue,执行多任务下载等等
我所理解的SDWebImage没有讲解很多细节的问题,这个我觉得自己看可能会收获更多吧。