SDWebImage

之前面试,让你说说对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,它其实主要涉及一个SDWebImageManagerSDWebImageOperation俩个相关的类(PS:其实我觉得下载图片和下载视频其实是一件挺相似的事情,只是视频下载数据量大一点而已。而且如果我们去看一下那些主流的视频软件,他们通常是把视频剪成很多段,然后分段下载和使用。而之前我问个别人这样的问题,假如要下载大量的视频,你该怎样做,很多人都说就放到GCD中下载就行了,我觉得这样做很鸡肋,难道你不需要对你的下载的视频操作任务进行管理吗,如果用户要删除正在下载的视频呢?所以在SDWebImage实际上是形成了一个下载operation,然后存储起来,所以下载任务的设置和正在下载功能的设置是分开的,而这个UIImageView+WebCache分类很明显只是设置了下载任务并且存储起来,也就是将某个url的下载任务放到了一个下载池里面。)



SDWebImageManager类其实是一个单例方法。


其中最主要的下载方法是downloadImageWithURL:options:progress:completed:也就是SDWebImage的核心功能区域,他既要实现图片下载,又要把下载的图片缓存起来,具体怎么实现,想了解的人可以具体看一下代码。


当然,图片的下载和缓存都是涉及到方方面的,所以在SDWebImageManager有俩个SDWebImageDownloaderSDImageCache类属性,这才是真正的下载和缓存功能代码区域。而SDWebImageManager实际上是联系这俩者的桥梁,即SDWebImageManager调度SDWebImageDownloaderSDImageCache形成图片的下载和缓存的operation,而UIImageView+WebCache通过调度SDWebImageManager方法设置获取下载的图片



我觉得核心就是我上面讲的东西。



SDWebImageDownloader


如图中解释,这个类实现了图片的异步下载和加载优化

核心代码在downloadImageWithURL:options:progress:completed:


所以我总结起来这个类是对下载的一个高度抽象



SDImageCache


如图中解释,它就是管理内存缓存和硬盘缓存的。而硬盘缓存写入任务是异步执行的,所以他不会延迟UI.



SDWebImageDownloaderOperation继承自NSOperation,形成下载任务方便存储起来,方便之后执行。所以其实整个这个图片下载还运用了NSOperation和NSOperationQueue,执行多任务下载等等



我所理解的SDWebImage没有讲解很多细节的问题,这个我觉得自己看可能会收获更多吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值