这篇文章主要是看SDWebImage中的SDWebImageCoderManage.h文件
在.h文件中,可以看到SDWebImageCoderManage遵守SDWebImageCoder协议
在SDWebImageCoder协议中,各个方法的作用如下所示:
/*
这是提供自定义图像解码/编码的图像编码器协议。
这些方法都需要实现。
注意这些方法不是从主队列调用的。
*/
#pragma mark -Decoding解码方法
//如果这个编码器可以解码一些数据,返回YES,否则,数据应该传递给另外一个编码器中
- (BOOL)canDecodeFromData:(nullable NSData *)data;
//将数据解码为图片
- (nullable UIImage *)decodedImageWithData:(nullable NSData *)data;
//解压具有原始图像和图像数据的图像
- (nullable UIImage *)decompressedImageWithImage:(nullable UIImage *)image
data:(NSData * _Nullable * _Nonnull)data
options:(nullable NSDictionary<NSString*, NSObject*>*)optionsDict;
#pragma mark - encoding 编码方法
//如果这个编码器可以编码一些图像,返回YES。否则,它应该被传递给另一个编码器。
- (BOOL)canEncodeToFormat:(SDImageFormat)format;
//将图像编码为图像数据
- (nullable NSData *)encodedDataWithImage:(nullable UIImage *)image format:(SDImageFormat)format;
在SDWebImageCoderManage.h的文件中,定义的各个变量的方法作用为:
//所有的编码器都处于管理之中,编码器数组是一个优先队列,这意味着后面添加的编码器将具有最高优先级。
@property (nonatomic, copy, readwrite, nullable) NSArray<id<SDWebImageCoder>> *coders;
//添加一个新的编码器到数组的末尾,这个新添加的拥有最高的优先级
- (void)addCoder:(nonnull id<SDWebImageCoder>)coder;
//移除在编码器数组中的某个编码器
- (void)removeCoder:(nonnull id<SDWebImageCoder>)coder;
在.m文件中,依旧定义和加锁和解锁的方法,相应的代码如下:
#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
#define UNLOCK(lock) dispatch_semaphore_signal(lock);
使用单例模式仅持有一份内存,在init方法中,初始化默认的编码器
相应的代码为:
- (instancetype)init {
if (self = [super init]) {
// 默认情况下使用SDWebImageImageIOCoder(支持PNG,JPEG,TIFF,GIF(只支持静态的gif,即只支持第一帧的编码和解码),HEIC)
NSMutableArray<id<SDWebImageCoder>> *mutableCoders = [@[[SDWebImageImageIOCoder sharedCoder]] mutableCopy];
#ifdef SD_WEBP
//内置的编码器,支持WebP和动画WebP
[mutableCoders addObject:[SDWebImageWebPCoder sharedCoder]];
#endif
_coders = [mutableCoders copy];
_codersLock = dispatch_semaphore_create(1);
}
return self;
}
下面就是相应的编解码方法的实现
网友评论