SDWebImage
前言:在我们日常的开发中我们通常会使用
SDWebImage
来实现UIImageView
加载来自互联网的远程图片
官方介绍:一个具有缓存支持的异步映像下载程序
功能简介
- 一个添加了web图片加载和缓存管理的
UIImageView
分类 - 一个异步图片下载器
- 一个异步的内存加磁盘综合存储图片并且自动处理过期图片
- 支持动态
gif
图 - 支持
webP
格式的图片 - 后台图片解压处理
- 确保同样的图片
url
不会下载多次 - 确保伪造的图片
url
不会重复尝试下载 - 确保主线程不会阻塞
- 下载进度监听
注意事项
SDWebImage
最大并发个数:6
- 默认下载超时时间 :
15s
- 默认磁盘缓存时间: 一周
import
#import <SDWebImage/SDWebImage.h>
SDWebImage的公共接口
- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
context:(nullable SDWebImageContext *)context;
- (void)sd_setImageWithURL:(nullable NSURL *)url
completed:(nullable SDExternalCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
completed:(nullable SDExternalCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
progress:(nullable SDImageLoaderProgressBlock)progressBlock
completed:(nullable SDExternalCompletionBlock)completedBlock;
SDWebImageOptions
,设置的图片加载以及缓存策略,有几种类型
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
/**
默认情况下,当一个URL下载失败的时候,这个URL会被加入黑名单列表,
下次再有这个url的请求则停止请求。
如果为true,这个值表示需要再尝试请求。
*/
SDWebImageRetryFailed = 1 << 0,
/**
默认情况下,当UI可以交互的时候就开始加载图片。这个标记可以阻止这个时候加载。
而是当UIScrollView开始减速滑动的时候开始加载。
*/
SDWebImageLowPriority = 1 << 1,
/**
这个flag启动渐进式下载图像,类似浏览器加载图像那样逐步显示(从上倒下加载)
*/
SDWebImageProgressiveLoad = 1 << 2,
/**
一个图片缓存了,还是会重新请求.并且缓存侧略依据NSURLCache而不是SDImageCache。即在URL没变但是服务器图片发生更新时使用,这时我们需要在NSMutableRequest中设置上(If-Modified-Since-其实是缓存的最后修改时间,有后台返回),这个参数是在上一次网络请求之后,NSResponse中的Last-Modified获取,并保存下载,在下次发送网络请求的时候添加到请求头中;这样当我们下载同一张照片的时候,其实是拿取的上次GET请求的NSURLCache缓存中的图片,并且如果后台发生变化会重新请求图片
*/
SDWebImageRefreshCached = 1 << 3,
/**
启动后台下载,实现原理是通过向系统询问后台的额外时间来完成请求的。 如果后台任务到期,则操作将被取消
*/
SDWebImageContinueInBackground = 1 << 4,
/**
当设置了NSMutableURLRequest.HTTPShouldHandleCookies = YES时,可以控制存储NSHTTPCookieStorage中的cookie
*/
SDWebImageHandleCookies = 1 << 5,
/**
允许不安全的SSL证书,用于测试环境,在正式环境中谨慎使用
*/
SDWebImageAllowInvalidSSLCertificates = 1 << 6,
/**
默认情况下,image在加载的时候是按照他们在队列中的顺序装载的(就是先进先出)。这个flag会把他们移动到队列的前端,并且立刻装载,而不是等到当前队列装载的时候再装载。
*/
SDWebImageHighPriority = 1 << 7,
/**
默认情况下,占位图会在图片下载的时候显示.这个flag开启会延迟占位图显示的时间,等到图片下载完成之后才会显示占位图.
*/
SDWebImageDelayPlaceholder = 1 << 8,
/**
一般不会在动画图片上调用 transformDownloadedImage 代理方法,这样不能够管理动画图片
这个flag为尝试转换动画图片
*/
SDWebImageTransformAnimatedImage = 1 << 9,
/**
图片在下载后被加载到imageView。这个flag避免自动设置图片,来手动设置一下图片(引用一个滤镜或者加入透入动画)
*/
SDWebImageAvoidAutoSetImage = 1 << 10,
/**
默认情况下,图像将根据其原始大小进行解码。 在iOS上,此flat会将图片缩小到与设备的受限内存兼容的大小。 但如果设置了SDWebImageAvoidDecodeImage则此flat不起作用。 如果设置了SDWebImageProgressiveLoad它将被忽略
*/
SDWebImageScaleDownLargeImages = 1 << 11,
/**
结合SDWebImageQueryMemoryData设置同步查询图像数据(一般不建议这么使用,除非是在同一个runloop里避免单元格复用时发生闪现)
*/
SDWebImageQueryMemoryData = 1 << 12,
/**
结合SDWebImageQueryMemoryData设置同步查询图像数据(一般不建议这么使用,除非是在同一个runloop里避免单元格复用时发生闪现)
*/
SDWebImageQueryMemoryDataSync = 1 << 13,
/**
如果内存查询没有的时候,强制同步磁盘查询(这三个查询可以组合使用,一般不建议这么使用,除非是在同一个runloop里避免单元格复用时发生闪现)
*/
SDWebImageQueryDiskDataSync = 1 << 14,
/**
* 默认情况下,当缓存丢失时,SD将从网络下载图像。 此flat可以防止这样,使其仅从缓存加载。
*/
SDWebImageFromCacheOnly = 1 << 15,
/**
* 默认情况下,SD在下载之前先从缓存中查找,此flat可以防止这样,使其仅从网络下载
*/
SDWebImageFromLoaderOnly = 1 << 16,
/**
* 默认情况下,SD在图像加载完成后使用SDWebImageTransition进行某些视图转换,此转换仅适用于从网络下载图像。 此flat可以强制为内存和磁盘缓存应用视图转换。
*/
SDWebImageForceTransition = 1 << 17,
/**
默认情况下,SD在查询缓存和从网络下载时会在后台解码图像,这有助于提高性能,因为在屏幕上渲染图像时,需要首先对其进行解码。这发生在Core Animation的主队列中。然而此过程也可能会增加内存使用量。
如果由于过多的内存消耗而遇到问题,可以用此flat禁止解码图像。
*/
SDWebImageAvoidDecodeImage = 1 << 18,
/**
* 默认情况下,SD会解码动画图像,该flat强制只解码第一帧并生成静态图。
*/
SDWebImageDecodeFirstFrameOnly = 1 << 19,
/**
默认情况下,对于SDAnimatedImage,SD会在渲染过程中解码动画图像帧以减少内存使用量。 但是用户可以指定将所有帧预加载到内存中,以便在大量imageView共享动画图像时降低CPU使用率。这实际上会在后台队列中触发preloadAllAnimatedImageFrames(仅限磁盘缓存和下载)。
*/
SDWebImagePreloadAllFrames = 1 << 20
};
代码实现
NSURL *url = [NSURL URLWithString:@"https://datongyungou.oss-cn-qingdao.aliyuncs.com/upload/user/9/avatar/20210726/1627294004154_123748.jpg"];
[self.mainImageView sd_setImageWithURL:url];
[self.mainImageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
SDWebImageManager *manager = [SDWebImageManager sharedManager] ;
[manager downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// progression tracking code
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// do something with image
}
}];
加载动态图片
SDAnimatedImageView
和SDAnimatedImage
SDAnimatedImageView *imageView = [SDAnimatedImageView new];
SDAnimatedImage *animatedImage = [SDAnimatedImage imageNamed:@"image.gif"];
imageView.image = animatedImage;