SDWebImage的知名度就不用说了,简单介绍一下,它是一个图片框架,支持从网络中下载且缓存图片,并设置图片到对应的UIImageView 控件或者 UIButton 控件。使用SDWebImage来管理图片加载,会极大地提高我们的开发效率,从而让我们更加专注于业务逻辑实现。也正是因为这样,让我们很多开发都只会用SDWebImage,而忽略了它的内部实现,今天我就给大家介绍一下SDWebImage的内部实现及原理。
一、SDWebImage 概述
SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图片的功能。它具有以下功能:
1、提供了一个UIImageView的 category用来加载网络图片,并对网络图片的缓存进行管理。
2、采用异步方式来下载网络图片
3、采用异步方式,使用 memory+disk 来缓存网络图片,自动管理缓存。
4、支持 GIF 动画
5、支持 WebP 格式
6、同一个 URL 的网络图片不会被重复下载
7、失效的 URL 不会被无限重试
8、耗时操作都在子线程,确保不会阻塞主线程
9、使用 GCD 和 ARC
10、支持 Arm64
二、SDWebImage 使用
1、使用 ImageView+WebCache category 来加载 网络图片
UIImageView调用方法.png
2.、使用Blocks,在 block 中得到图片下载进度和图片加载完成(下载完成或者读取缓存)的回调,如果你在图片加载完成前取消了请求操作,就不会收到成功或失败的回调
Block方式给UIImageView设置图片.png
3、使用SDWebImageManager,SDWebImageManager为UIImageView+WebCache category的实现提供下载图片接口。
SDWebImageManager下载图片.png
4、单独使用 SDWebImageDownloader 来下载图片,但是图片内容不会缓存。
SDWebImageDownloader下载图片.png
5、使用 SDImageCache 异步缓存图片
SDImageCache 同时缓存到内存和磁盘中。
图片存入内存和磁盘.png
SDImageCache 只缓存到内存:
图片只存入内存.png
读取缓存时可以使用 queryDiskCacheForKey:done: 方法,图片缓存的 key 是唯一的,通常就是图片的 absolute URL。
读取缓存.png
6、清除缓存文件
清楚缓存文件.png
7、获取所有缓存图片的总大小
获取缓存图片总大小.png
8、获取缓存图片张数
获取缓存图片张数.png
9、直接从缓存中提取图片
从缓存提取图片.png
10、直接删除缓存中得图片
删除缓存中的图片.png
11、判断本地缓存中是否存在网络中的图片
是否存在网络图片.png
在实际的运用中,我们并不直接使用SDWebImageDownloader类及SDImageCache类来执行图片的下载及缓存。为了方便