原始碼閱讀:SDWebImage(十七)——UIView+WebCacheOperation

堯少羽發表於2018-07-11

該文章閱讀的SDWebImage的版本為4.3.3。

這個分類提供的方法用於在框架內部取消UIView上影像的載入。

1.公共方法

/**
 儲存影像的載入操作物件
 */
- (void)sd_setImageLoadOperation:(nullable id<SDWebImageOperation>)operation forKey:(nullable NSString *)key;
複製程式碼
/**
 取消key對應的所有操作
 */
- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key;
複製程式碼
/**
 刪除key對應的儲存的所有操作但不取消
 */
- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key;
複製程式碼

2.私有靜態變數

/**
 用於關聯物件的key
 */
static char loadOperationKey;
複製程式碼

3.私有型別定義

/**
 定義了用於儲存key和與之關聯的操作物件的集合型別
 */
typedef NSMapTable<NSString *, id<SDWebImageOperation>> SDOperationsDictionary;
複製程式碼

4.關聯物件方法

/**
 獲取儲存操作物件的字典
 */
- (SDOperationsDictionary *)sd_operationDictionary {
    // 加鎖
    @synchronized(self) {
        // 通過關聯物件獲取儲存操作物件的字典
        SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey);
        // 如果有就直接返回
        if (operations) {
            return operations;
        }
        // 如果沒有就建立key是強引用,value是弱引用的儲存操作物件的字典
        operations = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];
        // 通過關聯物件儲存儲存操作物件的字典
        objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        // 返回儲存操作物件的字典
        return operations;
    }
}
複製程式碼

5.實現

- (void)sd_setImageLoadOperation:(nullable id<SDWebImageOperation>)operation forKey:(nullable NSString *)key {
    // 必須要傳key
    if (key) {
        // 先取消掉key對應的所有操作
        [self sd_cancelImageLoadOperationWithKey:key];
        // 如果傳了操作物件
        if (operation) {
            // 獲取到儲存操作物件的字典
            SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
            // 加鎖
            @synchronized (self) {
                // 賦值儲存
                [operationDictionary setObject:operation forKey:key];
            }
        }
    }
}
複製程式碼
- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key {
    // 獲取到儲存操作物件的字典
    SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
    // 獲取到key對應的操作物件
    id<SDWebImageOperation> operation;
    @synchronized (self) {
        operation = [operationDictionary objectForKey:key];
    }
    if (operation) {
        // 呼叫操作物件的取消操作
        if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]){
            [operation cancel];
        }
        // 從儲存操作物件的字典中移除key對應的操作
        @synchronized (self) {
            [operationDictionary removeObjectForKey:key];
        }
    }
}
複製程式碼
- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key {
    // 必須要傳key
    if (key) {
        // 獲取到儲存操作物件的字典
        SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
        // 直接從儲存操作物件的字典中移除key對應的操作
        @synchronized (self) {
            [operationDictionary removeObjectForKey:key];
        }
    }
}
複製程式碼

6.總結

這個分類的作用比較簡單,就是提供了根據key取消物件載入操作的功能。

原始碼閱讀系列:SDWebImage

原始碼閱讀:SDWebImage(一)——從使用入手

原始碼閱讀:SDWebImage(二)——SDWebImageCompat

原始碼閱讀:SDWebImage(三)——NSData+ImageContentType

原始碼閱讀:SDWebImage(四)——SDWebImageCoder

原始碼閱讀:SDWebImage(五)——SDWebImageFrame

原始碼閱讀:SDWebImage(六)——SDWebImageCoderHelper

原始碼閱讀:SDWebImage(七)——SDWebImageImageIOCoder

原始碼閱讀:SDWebImage(八)——SDWebImageGIFCoder

原始碼閱讀:SDWebImage(九)——SDWebImageCodersManager

原始碼閱讀:SDWebImage(十)——SDImageCacheConfig

原始碼閱讀:SDWebImage(十一)——SDImageCache

原始碼閱讀:SDWebImage(十二)——SDWebImageDownloaderOperation

原始碼閱讀:SDWebImage(十三)——SDWebImageDownloader

原始碼閱讀:SDWebImage(十四)——SDWebImageManager

原始碼閱讀:SDWebImage(十五)——SDWebImagePrefetcher

原始碼閱讀:SDWebImage(十六)——SDWebImageTransition

原始碼閱讀:SDWebImage(十七)——UIView+WebCacheOperation

原始碼閱讀:SDWebImage(十八)——UIView+WebCache

原始碼閱讀:SDWebImage(十九)——UIImage+ForceDecode/UIImage+GIF/UIImage+MultiFormat

原始碼閱讀:SDWebImage(二十)——UIButton+WebCache

原始碼閱讀:SDWebImage(二十一)——UIImageView+WebCache/UIImageView+HighlightedWebCache

相關文章