SDWebImage 一覽

博客同步于SDWebImage 源碼一覽 | AndyCuiの博客

SDImageCache

SDMemoryCache (只針對 iOS, 其他系統(tǒng)與 NSCache 一樣)

SDMemoryCache: 繼承于NSCache. 聲明三個私有屬性: config, weakCache, weakCacheLock

  • config: SDImageCacheConfig 緩存配置信息
  • weakCache: NSMapTable<KeyType, ObjectType> 緩存信息
  • weakCacheLock: dispatch_semaphore_t 鎖,保證數(shù)據(jù)安全
 /// 初始化 config, weakCache, weakCacheLock 變量, 添加一個內(nèi)存警告監(jiān)聽, 內(nèi)存警告時釋放內(nèi)存.
 - (instancetype)initWithConfig:(SDImageCacheConfig *)config
 
 // shouldUseWeakMemoryCache: 為 true 是將數(shù)保存到 weakCache, 反之不保存到 weakCache;獲取是為 flase 是直接返回父類查出數(shù)據(jù). 反之判斷內(nèi)存中是否有對應(yīng)數(shù)據(jù),沒有再在 weakCache 獲取,并保存到內(nèi)存.
 
 
 /// 保存數(shù)據(jù) 重寫父類方法,首先將數(shù)據(jù)保存內(nèi)存,然后再將數(shù)據(jù)存儲在 weakCache.(weakCacheLock保證數(shù)據(jù)安全)
 /// 如果 shouldUseWeakMemoryCache 為 false 則不存儲到 weakCache.
 - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g
 
 /// 獲取數(shù)據(jù) 重寫父類方法. 判斷是否是弱內(nèi)存緩存,否: 直接返回父類查詢對象.是: 在 weakCache 取出相應(yīng)對象并保存內(nèi)存中返回.
 - (id)objectForKey:(id)key
 
 /// 根據(jù) key 移除數(shù)據(jù) 重寫父類方法. 如果 shouldUseWeakMemoryCache 為 false 只移除內(nèi)存數(shù)據(jù),為 true 移除 weakCache.
 - (void)removeObjectForKey:(id)key
 
 /// 移除數(shù)據(jù) 重寫父類方法. 如果 shouldUseWeakMemoryCache 為 false 只移除內(nèi)存數(shù)據(jù),為 true 移除 weakCache.
 - (void)removeAllObjects 
 

SDImageCache

SDImageCache: 圖片緩存類

  • memCache: SDMemoryCache 內(nèi)存控制器
  • diskCachePath: NSString 根路徑
  • customPaths: NSMutableArray<NSString *> 自定義路徑 只讀路徑
  • ioQueue: dispatch_queue_t 數(shù)據(jù)讀取隊列
  • fileManager: NSFileManager 文件管理器

/// 提供單例方式創(chuàng)建
+ (nonnull instancetype)sharedImageCache


/// 給屬性復(fù)制初始化. 默認(rèn)為 NSCachesDirectory 下路徑. 添加兩個通知 刪除舊數(shù)據(jù)
- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns
diskCacheDirectory:(nonnull NSString *)directory

/// 省略一系列文件路徑處理方法...

/// 對 key MD5加密處理產(chǎn)生文件名
- (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key

/**
 緩存數(shù)據(jù)
 self.config.shouldCacheImagesInMemory 為true 則保存內(nèi)存,否則只保存磁盤

 @param image 圖片
 @param imageData 圖片 Data
 @param key 鍵值
 @param toDisk 是否存磁盤
 @param completionBlock 存儲回調(diào)
 */
- (void)storeImage:(nullable UIImage *)image imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk completion:(nullable SDWebImageNoParamsBlock)completionBlock

// 保存文件.通過寫文件形式保存. self.config.shouldDisableiCloud 為 true 保存 iCloud
- (void)_storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key 

// 判斷是否有緩存文件存在
- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock

// 獲取存儲的數(shù)據(jù)
- (nullable NSData *)diskImageDataForKey:(nullable NSString *)key

// 僅在內(nèi)存查找緩存 
- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key

// 在磁盤查找緩存 diskImage && self.config.shouldCacheImagesInMemory 為 true 寫入內(nèi)存
- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key

// 緩存查找 先查找內(nèi)存,然后磁盤
- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock

// 移除緩存 (內(nèi)存與磁盤)
- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion

UIImageView 加載圖片

UIImageView+WebCache

UIImageView 類擴(kuò)展, 添加方法

/**
 UIImageView+WebCache 添加的方法最終都調(diào)用該方法.

 @param url 圖片 URL 地址
 @param placeholder 占位圖片
 @param options 加載模式
 @param progressBlock 進(jìn)度
 @param completedBlock 加載完成回調(diào)
*/
- (void)sd_setImageWithURL:(nullable NSURL *)url laceholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock

UIView+WebCache

UIImageView,UIButton 等添加的類目方法將調(diào)用該擴(kuò)展方法.

/**
 * 該方法采用了大量的回調(diào)函數(shù).
 * 1. 判斷當(dāng)前圖片是否在加載,如果在加載取消加載.
 * 2. 設(shè)置占位圖現(xiàn)在.
 * 3. 判斷 URL 是否有效,無效調(diào)用 completedBlock 返回
 * 4. 初始化 SDWebImageManager 對象
 * 5. 調(diào)用 SDWebImageManager 圖片加載方法.
 * 6. SDWebImageManager 回調(diào)中處理.
 * 6.1. 當(dāng)前對象已銷毀或者回調(diào)圖片 URL 與需要加載不一致,返回
 * 6.2. 判斷是否需要更新顯示圖片.調(diào)用 callCompletedBlockClojure 代碼.
 * 6.3. 需要更新圖片 調(diào)用圖片更換方法
 * 6.4. 將 SDWebImageOperation 添加到 SDOperationsDictionary
 */
 
- (void)sd_internalSetImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options operationKey:(nullable NSString *)operationKey setImageBlock:(nullable SDSetImageBlock)setImageBlock progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock context:(nullable NSDictionary<NSString *, id> *)context

SDWebImageManager

圖片緩存查找以及下載處理

/**
 * 1. 創(chuàng)建 SDWebImageCombinedOperation
 * 2. 判斷 URL 是否有效.無效直接返回
 * 3. 將 operation 加入到 runningOperations
 * 4. 調(diào)用 SDImageCache 中方法查找是否有緩存數(shù)據(jù),如果找到回調(diào) 移除 Operation
 * 5. 找不到用 SDWebImageDownloader 下載圖片.并保存緩存中.
- (id <SDWebImageOperation>)loadImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDInternalCompletionBlock)completedBlock
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容