SDWebImage是我们常用的异步图片加载库,有的小伙伴说,感觉源码读起来太费劲了,所以我们重头好好学习一下我们经常用的这个三方库。
一上来就说结构什么的容易把小白干懵逼,所以,我们先从用法开始读:
对UIImageView的网络图片操作
-
- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT;
最简单的方法,也是大家都知道怎么用的,异步下载图片,并且缓存它。 -
- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT;
也是经常用到的,一张图片用于预设图,然后在去用url去异步下载图片,并且缓存它。 -
- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT;
这个方法对于刚开始开发的小伙伴用的应该就不是特别多了,前两个参数,url和预设图没什么问题,但是第三个参数options代表了什么呢?
options这个参数是图片在下再过程中的设置情况,默认是0,也就是SDWebImageRetryFailed,代表着如果这个url下载图片失败了,那么将这个url拉入黑名单中,当第二次遇到这个url的时候,直接不进行下载。其他的枚举值将在文章底部详细解答。 -
- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock;
这个方法想必大家用的也比较多了吧,就是普通的加载图片,在下载结束后(包括成功和失败)给出一个回调的block:SDExternalCompletionBlock,这个block大家应该也很清楚了。不过不影响我多啰嗦几句:
typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL);
第一个参数,image为下载的图片
第二个参数,error,就是错误信息
第三个参数,一个枚举值,代表图片是从服务端获取、磁盘中获取或者是内存中获取
第四个参数,图片的url地址 -
- (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 SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock;
这个方法中添加了SDWebImageDownloaderProgressBlock这个block,接下来我们看下这个block
typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL);
第一个参数:receivedSize图片已经下载的大小
第二个参数:expectedSize预计图片大小
第三个参数:下载地址 -
- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray<NSURL *> *)arrayOfURLs;
传入一个元素为图片url的数组,然后循环播放这一组图片
-
- (void)sd_cancelCurrentAnimationImagesLoad;
和8为一组,对改数组停止播放
对UIButton的网络图片操作
-
/** * 获取当前图像的URL。 */ - (nullable NSURL *)sd_currentImageURL; - (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 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 SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock;
-
PS:2---8没有说明,因为和这些方法和UIImageView的用法完全相同
UButton的Alternate Image
-
- (nullable NSURL *)sd_currentAlternateImageURL; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock; - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock; - (void)sd_cancelCurrentImageLoad; - (void)sd_cancelCurrentAlternateImageLoad;
对枚举值SDWebImageOptions的说明
- SDWebImageRetryFailed = 1 << 0,
默认情况下,当URL下载失败时,该URL被列入黑名单,因此该库将不会继续尝试。 - SDWebImageLowPriority = 1 << 1,
默认情况下,图片下载是在用户界面交互过程中开始的,此标志会禁用此功能,
例如,导致UIScrollView减速下载延迟。 - SDWebImageCacheMemoryOnly = 1 << 2,
下载完成后,此标志禁用磁盘缓存,仅缓存在内存中 - SDWebImageProgressiveDownload = 1 << 3,
该标志启用渐进式下载,在下载过程中图像会像浏览器一样逐步显示。
默认情况下,仅在完全下载后才显示图像。 - SDWebImageRefreshCached = 1 << 4,
即使已缓存映像,也请遵守HTTP响应缓存控件,并在需要时从远程位置刷新映像。
磁盘缓存将由NSURLCache而不是SDWebImage处理,从而导致性能略有下降。
此选项有助于处理在相同请求网址后更改的图像,例如 Facebook图形API个人资料图片。
如果刷新了缓存的图像,则对缓存的图像调用一次完成块,然后对最终图像调用一次。
仅当无法使用嵌入式缓存清除参数将URL设为静态时,才使用此标志。 - SDWebImageContinueInBackground = 1 << 5,
在iOS 4以上版本中,如果应用程序进入后台运行,则继续下载图像。 这是通过要求系统提供
在后台增加时间以使请求完成。 如果后台任务到期,则该操作将被取消。 - SDWebImageHandleCookies = 1 << 6,
通过设置处理存储在NSHTTPCookieStore中的cookie
NSMutableURLRequest.HTTPShouldHandleCookies = YES; - SDWebImageAllowInvalidSSLCertificates = 1 << 7,
启用以允许不受信任的SSL证书。
用于测试目的。 在生产中请谨慎使用。 - SDWebImageHighPriority = 1 << 8,
默认情况下,图像按排队顺序加载。 此标志将它们移至
队列的最前面。 - SDWebImageDelayPlaceholder = 1 << 9,
默认情况下,占位符图像在加载图像时加载。 该标志将延迟加载
占位符图像的*,直到图像加载完成为止。 - SDWebImageTransformAnimatedImage = 1 << 10,
- 我们通常不对动画图像调用transformDownloadedImage委托方法,
- 因为大多数转换代码都会破坏它。
- 始终使用此标志对其进行转换。
- SDWebImageAvoidAutoSetImage = 1 << 11,
默认情况下,下载后将图像添加到imageView中。 但是在某些情况下,我们想
*在设置图像之前先伸出援手(例如,应用滤镜或将其添加为淡入淡出动画)
*如果要在成功时手动设置图像完成,请使用此标志 - SDWebImageScaleDownLargeImages = 1 << 12,
默认情况下,图像会按照原始尺寸进行解码。 在iOS上,此标志将按比例缩小
*图像大小应与设备的受限内存兼容。
*如果设置了“ SDWebImageProgressiveDownload”标志,则缩小比例无效。 - SDWebImageQueryDataWhenInMemory = 1 << 13,
默认情况下,当映像缓存在内存中时,我们不查询磁盘数据。 此掩码可以强制同时查询磁盘数据。
*建议与SDWebImageQueryDiskSync一起使用此标志,以确保将映像加载到同一运行循环中。 - SDWebImageQueryDiskSync = 1 << 14,
默认情况下,我们同步查询内存缓存,异步查询磁盘缓存。 此掩码可以强制同步查询磁盘缓存,以确保将映像加载到同一运行循环中。
*如果禁用内存缓存或在其他情况下,此标志可以避免在单元重用期间闪烁。 - SDWebImageFromCacheOnly = 1 << 15,
默认情况下,当缺少缓存时,将从网络下载映像。 该标志可以防止网络仅从缓存加载。 - SDWebImageForceTransition = 1 << 16
默认情况下,当您使用“ SDWebImageTransition”在图像加载完成后进行某些视图转换时,此转换仅适用于从网络下载图像。 此掩码也可以强制将视图转换应用于内存和磁盘缓存。