SDWebImage 實(shí)現(xiàn)原理
SDWebImage是個(gè)開源的圖片加載框架,這個(gè)框架主要實(shí)現(xiàn)了兩個(gè)功能:網(wǎng)絡(luò)圖片下載、網(wǎng)絡(luò)圖片緩存
一、主要實(shí)現(xiàn)類
- SDWebImageDownloader
- SDImageCache
- SDWebImageManager
SDWebImageDownloader 封裝了下載圖片的邏輯
SDImageCache 封裝了圖片緩存的邏輯
SDWebImageManager 用于管理圖片的下載與緩存
二、SDWebImageDownloader 的實(shí)現(xiàn)
+ (id)downloaderWithURL:(NSURL *)url
delegate:(id<SDWebImageDownloaderDelegate>)delegate
userInfo:(id)userInfo
lowPriority:(BOOL)lowPriority;
+ (id)downloaderWithURL:(NSURL *)url
delegate:(id<SDWebImageDownloaderDelegate>)delegate
userInfo:(id)userInfo;
+ (id)downloaderWithURL:(NSURL *)url
delegate:(id<SDWebImageDownloaderDelegate>)delegate;
三個(gè)類方法:根據(jù)URL異步下載數(shù)據(jù),通過代理監(jiān)聽下載完成的事件
三、SDImageCache的實(shí)現(xiàn)
將圖片緩存到本地的三個(gè)方法,緩存的思路實(shí)現(xiàn)如下:
1、緩存分兩種形式,內(nèi)存緩存和磁盤緩存。
- 內(nèi)存緩存:數(shù)據(jù)存到內(nèi)存,下次需要用時(shí),從內(nèi)存中獲取
- 磁盤緩存:數(shù)據(jù)存到磁盤上,下次從磁盤上讀取這份數(shù)據(jù)
2、先將圖片數(shù)據(jù)存到內(nèi)存,然后將圖片數(shù)據(jù)存到磁盤上,保存為一個(gè)文件,文件名是將URL經(jīng)過MD5加密之后的字符串作為文件名
3、網(wǎng)絡(luò)請(qǐng)求是對(duì)NSURLConnection進(jìn)行了封裝
- (void)storeImage:(UIImage *)image forKey:(NSString *)key;
- (void)storeImage:(UIImage *)image forKey:(NSString *)key
toDisk:(BOOL)toDisk;
- (void)storeImage:(UIImage *)image imageData:(NSData *)data
forKey:(NSString *)key
toDisk:(BOOL)toDisk;
從緩存中取數(shù)據(jù)的兩個(gè)方法
1、先從內(nèi)存中獲取,看是否有該圖片數(shù)據(jù),有的話獲取到
2、如果內(nèi)存中無圖片數(shù)據(jù),則通過將URL經(jīng)過MD5加密,作為文件名從磁盤讀取獲取圖片數(shù)據(jù)
- (UIImage *)imageFromKey:(NSString *)key;
- (UIImage *)imageFromKey:(NSString *)key fromDisk:(BOOL)fromDisk;
四、SDWebImageManager 的實(shí)現(xiàn)
- (void)downloadWithURL:(NSURL *)url delegate:(id<SDWebImageManagerDelegate>)delegate;
- (void)downloadWithURL:(NSURL *)url delegate:(id<SDWebImageManagerDelegate>)delegate retryFailed:(BOOL)retryFailed;
- (void)downloadWithURL:(NSURL *)url delegate:(id<SDWebImageManagerDelegate>)delegate retryFailed:(BOOL)retryFailed lowPriority:(BOOL)lowPriority;
以上三個(gè)SDWebImageManager類中的三個(gè)方法,功能是根據(jù)URL加載對(duì)應(yīng)的圖片數(shù)據(jù),內(nèi)部實(shí)現(xiàn)的思路:
1、先通過SDImageCache到緩存中獲取,看是否有緩存數(shù)據(jù)
2、如果緩存中無圖片數(shù)據(jù),則使用SDWebImageDownloader進(jìn)行網(wǎng)絡(luò)下載圖片
3、下載圖片完成之后,再調(diào)用SDImageCache將圖片數(shù)據(jù)存入緩存
五、UIImageView+WebCache
- (void)setImageWithURL:(NSURL *)url;
此方法中的內(nèi)部實(shí)現(xiàn),調(diào)用SDWebImageManager加載url對(duì)應(yīng)的圖片數(shù)據(jù),加載完成之后,給UIImageView顯示
其他功能
****UIImage+GIF****
用于解析GIF圖片,進(jìn)行GIF播放使用
****SDWebImageDecoder.h****
解碼圖片,獲取解碼之后的UIImage,從緩存、網(wǎng)絡(luò)中獲取的圖片,都是先調(diào)用這個(gè)類進(jìn)行解碼之后的圖片。優(yōu)化性能