該文章閱讀的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(二)——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