Write in the first
SDWebImage 是我们经常使用的一个异步图片加载库,在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。
像这种经常用又比较重要的内容,我觉得要做到初步理解,然后梳理总结常用方法,到最后夯实基础、活学活用。为此,自己本着好好学习,了解权威的目的,决定解读 SDWebImage框架。
本篇文章主要从【SD 框架结构】学习总结。
在「时间 & 知识 」有限内,总结的文章难免有「未全、不足 」的地方,还望各位好友指出,以提高文章质量。
目录:
- SDWebImage的概论
- SDWebImage的内部结构
- SDWebImage的实现原理
- SDWebImage的工作流程
- SDWebImage框架基本使用
- SDWebImage框架内部细节
1. SDWebImage的概论
- 提供了一个UIImageView的category用来加载网络图片并且对网络图片的缓存进行管理
- 采用异步方式来下载网络图片
- 采用异步方式,使用memory+disk来缓存网络图片,自动管理缓存。
- 支持GIF动画
- 支持WebP格式
- 同一个URL的网络图片不会被重复下载
- 失效的URL不会被无限重试
- 耗时操作都在子线程,确保不会阻塞主线程
- 使用GCD和ARC
- 支持Arm64
2. SDWebImage的内部结构
3. SDWebImage的实现原理
SDWebImage
是由一个 SDImageCache(一个处理缓存的类)
和 SDWebImageDownloader(负责下载网络图片)
,而 SDWebImageManager则是管理者
将前两者结合起来完成整个工作流程。
通过对UIImageView
的类别扩展来实现异步加载替换图片的工作。主要用到的对象:
1.
UIImageView (WebCache)
类别,入口封装,实现读取图片完成后的回调2.
SDWebImageManager
,对图片进行管理的中转站,记录那些图片正在读取。向下层读取Cache
(调用SDImageCache
),或者向网络读取对象(调用SDWebImageDownloader
)。实现SDImageCache
和SDWebImageDownloader
的回调。3.
SDImageCache
,根据URL的MD5摘要对图片进行存储和读取(实现存在内存中或者存在硬盘上两种实现)实现图片和内存清理工作。4.
SDWebImageDownloader
,根据URL向网络读取数据(实现部分读取和全部读取后再通知回调两种方式
4. SDWebImage的工作流程
SDWebImage
是一个成熟而且比较庞大的框架,但是在使用过程中并不需要太多的接口,这算是一种代码封装程度的体现。这里就介绍比较常用的几个接口。
5. SDWebImage框架基本使用
UIImageView+WebCache.h 下载图片
|
|
SDWebImageManager 管理者
|
|
SDWebImageDownloader 工具类(文件下载)
|
|
6. SDWebImage框架内部细节
1.SDImageCache是怎么做数据管理的?
SDImageCache分两个部分,一个是内存层面的,一个是磁盘层面的。
内存层面的相当是个缓存器,以Key-Value的形式存储图片。
当内存不够的时候会清除所有缓存图片。用搜索文件系统的方式做管理,文件替换方式是以时间为单位,剔除时间大于一周的图片文件。
当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,如果有直接返回,
没有的话去访问磁盘,将图片从磁盘读取出来,将图片对象放到内存层面做备份,再返回调用层
2.系统级内存警告如何处理(面试)?
|
|
3.该框架内部对内存警告的处理方式?
内部通过监听通知的方式清理缓存
1.监听到
UIApplicationDidReceiveMemoryWarningNotification
接收到内存警告的通知后,调用clearMemory
方法,清除内存缓存2.当监听到
UIApplicationWillTerminateNotification
接收到应用程序将要终止通知,调用cleanDisk
方法,清理过期(默认大于一周)的磁盘缓存3.当监听到
UIApplicationDidEnterBackgroundNotification
接收到应用程序进入后台通知,调用backgroundCleanDisk
方法,清理过期磁盘缓存
补充:
内存缓存: 使用NSCahce
对象实现,最大内存缓存值以像素为单位
磁盘缓存: 使用 NSFileManager
存储在 Cache
目录中,最大磁盘缓存是以字节为单位,最大磁盘缓存的时间默认为1
周
4.最大并发数量
|
|
5.缓存文件的保存名称如何处理?
SDImageCache
,拿到图片的URL路径,对该路径进行MD5加密对图片进行存储和读取。
6.该框架进行缓存处理的方式?
可变字典—>NSCache
7.如何判断图片的类型?
|
|
8.播放Gif图片?
|
|
9.队列中任务的处理方式?
FIFO
,下载任务的执行方式:默认为先进先出
10.请求超时的时间?
|
|
PS.
最后分享一下学习多线程自定义NSOperation
下载图片思路:
文字解析:
1.根据图片的
url
先去检查images
(内存缓存)中该图片是否存在,如果存在就直接显示到cell
上;否则去检查磁盘缓存(沙盒)。2.如果有磁盘缓存(沙盒),加载沙盒中对应的图片显示到
cell
上,再保存一份到内存缓存;否则先显示占位图片,再检查operations
(操作缓存)中该图片是否正在下载,如果是 就等待下载;否则创建下载operations
操作任务,保存到操作缓存中去下载。3.下载完成后(需要主动刷新显示(采用局部刷新)),将操作从操作缓存中移除,将图片在内存缓存(先) 和 沙盒(后)中各保存一份。
期待
- 如果在阅读过程中遇到 error || new ideas,希望你能 messages 我,我会及时改正谢谢。
- 点击右上角的 喜欢 和 订阅Rss 按钮,可以收藏本仓库,并在 Demo 更新时收到邮件通知。