博客同步于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