美文网首页
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