博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDWebImage
阅读量:5236 次
发布时间:2019-06-14

本文共 1485 字,大约阅读时间需要 4 分钟。

下载过程:

SDWebImageManager:从缓存加载图片(缓存包括内存缓存和磁盘缓存)

SDImageCache:从缓存加载图片用到的一个类,所有的缓存操作都是它来执行的

如果缓存中没有图片,在它的回调函数里去创建 SDWebImageDownloader,它并没有真正的去执行下载操作,只是去设置下载操作,比如说超时多长时间就不下载了、还有一些请求操作,真正的下载操作是SDWebImageDownloader去调用SDWebImageDownloaderOperation

clearDisk (NSCache)清空磁盘缓存,将所有缓存目录中的文件,全部删除! 实际工作,将缓存目录直接删除,再次创建一个同名空目录!

cleanDisk (接收到应用程序将要终止通知)清理磁盘缓存策略

cleanDisk执行过程:

获取磁盘路径URL,根据路径获取资源(存入NSArray)

定义一个可变字典,记录所有缓存文件

定义一个可变数组,遍历资源,将过期文件记录到可变数组里边,累加文件的总大小,然后遍历过期文件数组删除过期文件

如果剩余磁盘缓存空间超出最大限额,再次执行清理操作,删除最早的文件 循环依次删除文件,直到低于期望的缓存限额,SDWebimage里边的期望限额为最大限额的一半

内存缓存是使用NSCache实现的,最大内存缓存值以像素为单位

最大磁盘缓存是以字节为单位,最大磁盘缓存的时间默认为1周

下载操作的最大并发数默认为6

下载操作的超时时长最长默认为15秒

SDWebImage是如何区分不同格式的图像的(精确判断文件类型):

#import "NSData+ImageContentType.h"

拿到文件的二进制数据,取出第一个字节和switch里的分支比较来判断

PNG:压缩比没有JPG高,但是无损压缩,解压缩性能高,苹果推荐的图像格式!

JPG:压缩比最高的一种图片格式,有损压缩!最多使用的场景,照相机!解压缩的性能不好!

GIF:序列桢动图,特点:只支持256种颜色!最流行的时候在1998~1999,有专利的!

SDWebImage缓存图片的名称是用URL的md5加密后生成的32位字符串作为文件名的

 

利用通知中心观察,能够保证缓存文件的大小始终在控制范围之内!

- UIApplicationDidReceiveMemoryWarningNotification 接收到内存警告的通知

执行 clearMemory 方法,清理内存缓存!

- UIApplicationWillTerminateNotification 接收到应用程序将要终止通知

执行 cleanDisk 方法,清理磁盘缓存!

- UIApplicationDidEnterBackgroundNotification 接收到应用程序进入后台通知

执行 backgroundCleanDisk 方法,后台清理磁盘!

 

内存缓存: 使用NSCahce对象实现

磁盘缓存: 使用 NSFileManager 存储在 Cache 目录中

SDImageCache提供了大量方法来缓存、获取、移除及清空图片。为了方便地在内存或磁盘中对它进行这些操作,

我们需要为每个图片设置一个key来索引它。在内存中将其作为NSCache的key值,在磁盘中用这key的md5作为图片的文件名。

在SDWebImage 中使用图片的 url 最为 key (md5)

 

转载于:https://www.cnblogs.com/sunshineandsand/p/4604974.html

你可能感兴趣的文章
hibernate增删改查
查看>>
计算机网络面试题 系列一
查看>>
BZOJ-1069 [SCOI2007]最大土地面积
查看>>
图解集合5:不正确地使用HashMap引发死循环及元素丢失
查看>>
损失函数与正则项之间的关系和分析
查看>>
【NOIP2015】提高组
查看>>
微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)
查看>>
【原创】TransHost远控程序分析
查看>>
vue.js 解决跨域问题
查看>>
Android的Kotlin秘方(I):OnGlobalLayoutListener
查看>>
纵向扩展与横向扩展
查看>>
为什么要做url encode
查看>>
component和bean区别
查看>>
CAP
查看>>
jquery中attr和prop的区别
查看>>
js里面获取相同class的value
查看>>
ORACLE not available如何解决
查看>>
Linux iptables详解(1)
查看>>
boost 同步定时器
查看>>
vue封装element中table组件
查看>>