https://huang303513.github.io/2017/05/01/SDWebImage%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90(%E4%B8%80).html

SDWebImageCompat

  • 通过引入#import <TargetConditionals.h> 来定义了几个宏如SD_UIKit, SD_IOS, SD_MAC等
  • 如果是MAC平台,引入AppKit, 同时将NSImage,NSImageView定义为UIImageUIImageView来保证代码统一
  • 通过网路上下载的图片,根据后缀名@2x@3x来自适应不同屏幕

SDWebImageOperation

  • 这个是一个protocol,只定义了一个cancel方法,其中SDWebImageDownloaderOperation实现了这个协议

UIView + WebCacheOperation

  • 在当前UIView中通过objc_setAssociatedObject添加了一个mutableDictionary,在这个dictionary中维护了一个operation 和key的对应关系,其中value为SDWebImageOperation

UIView+WebCache

- (void)sd_internalSetImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options operationKey:(nullable NSString *)operationKey setImageBlock:(nullable SDSetImageBlock)setImageBlock progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock

  • 如果没有占位符,先展示占位符,然后调用SDWebImageManager.sharedManager的loadImage方法来load图片
    其中如果是SDWebImageAvoidAutoSetImage,那么调用completedBlock,否则调用sd_setImage
  • 定义了static char TAG_ACTIVITY_INDICATOR, static char TAG_ACTIVITY_STYLE,static char TAG_ACTIVITY_SHOW三个key.给当前view添加了associatedObject,来设置activityIndicator是否显示,样式等。显示在view的正中心

UIButton+WebCache

  • 通过 typedef定义了一种字典类型 typedef NSMutableDictionary<NSNumber *, NSURL *> SDStateImageURLDictionary;并给UIButton添加了这个字典属性
1
2
3
4
5
6
7
8
9
- (SDStateImageURLDictionary *)imageURLStorage {
SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey);

if (!storage) {
storage = [NSMutableDictionary dictionary];
objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

return storage;
}

NSData+ImageContentType

  • 对于一个图片文件,前几个字节标志了文件的格式
    如png,前几个字节的hex值为89504e470d0a,转换成string即PNG
  • vim中通过:%!xxd即可查看hex值https://vi.stackexchange.com/questions/2232/how-can-i-use-vim-as-a-hex-editor
  • 对于其他文件的magic number可以在这里查看https://gist.github.com/leommoore/f9e57ba2aa4bf197ebc5

UIImage+GIF

  • 在SDWebImage中已经去掉对GIF的支持,如果是GIF图片的话会仅仅展示第一帧

UIImage+MultiFormat

  • sd_imageWithData,先判断data的图片格式是什么,然后分别调用sd_animatedGIFWithDatasd_imageWithWebPData来进行不同的初始化
  • 如果是JPEG或者是PNG,那么从exif中取出图片的方向,并做相应初始化
  • sd_imageDataAsFormat通过当前图片来生成NSData(相当于里面会判断不同类型,然后生成不同的格式的data)

FLAnimatedImageView+WebCache

  • 这个实际上就是为FLAnimatedImageView添加了sd设置图片的方法。
    挡返回了imageData的时候,判断格式是否为gif,如果是gif, 那么久使用FLAnimatedImage animatedImageWithGIFData来放到FLAnimatedImageView的animatedImage属性里面

  • 判断是否可以导入对应文件

1
2
3
4
5
#if __has_include(<FLAnimatedImage/FLAnimatedImage.h>)
#import <FLAnimatedImage/FLAnimatedImage.h>
#else
#import "FLAnimatedImageView.h"
#endif