SDWebImage 實(shí)現(xiàn)原理粗解

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)化性能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容