美文网首页
SDWebImage源码阅读(七)

SDWebImage源码阅读(七)

作者: 落叶兮兮 | 来源:发表于2020-07-13 16:42 被阅读0次

这篇文章主要是看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;
}

下面就是相应的编解码方法的实现

相关文章

网友评论

      本文标题:SDWebImage源码阅读(七)

      本文链接:https://www.haomeiwen.com/subject/hnzacktx.html