在SDImageCache.m中找到diskImageForKey方法,發(fā)現(xiàn)SDWebImage每次加載網(wǎng)絡(luò)圖片都會進行解碼屈梁,并將圖片存到cache使得之后的加載更加快,效果更加好。但是問題就在于去解碼這個操作,如果傳進的圖片分辨率特別的高荣恐,它的解碼會消耗大量的內(nèi)存,所以當圖片過大時不進行解碼操作累贤。
- (nullable UIImage *)diskImageForKey:(nullable NSString *)key {
NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];
if (data) {
UIImage *image = [UIImage sd_imageWithData:data];
image = [self scaledImageForKey:key image:image];
//當圖片過大時(大于5M)不解碼
if (data.length > 5*1024*1024) {
return image;
}else{
if (self.config.shouldDecompressImages) {
image = [UIImage decodedImageWithImage:image];
}
return image;
}
}
else {
return nil;
}
}
一般我們都是使用:
+ (nullable UIImage *)imageNamed:(NSString *)name; // load from main bundle
+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;
兩種方式加載圖片
為什么要對圖片進行解碼?難道不能直接使用上面的兩種加載方式直接進行加載顯示嗎,答案是可以少漆,而且大概我們編碼都是使用上面的兩種方式直接在主線程加載圖片然后顯示在UIImageView上臼膏,并且并沒有發(fā)現(xiàn)什么問題。那為什么SDWebImage 還要費勁去進行解碼圖片呢示损,其實我們自己不解碼圖片我們也是可以直接使用的(其實是系統(tǒng)為我們進行了解碼的操作)渗磅,一般下載的圖片或者我們手動拖進主bundle 的圖片都是PNG 或者JPG 其他格式的圖片,這些圖片都是經(jīng)過編碼壓縮后的圖片數(shù)據(jù)检访,并不是控件可以直接顯示的位圖始鱼,如果我們直接使用 "+ (nullable UIImage *)imageNamed:(NSString *)name" 來加載圖片,系統(tǒng)默認會在主線程立即進行圖片的解碼工作脆贵,這個過程就是把圖片數(shù)據(jù)解碼成可供控件直接顯示的位圖數(shù)據(jù)医清,由于這個解碼操作比較耗時,并且默認是在主線程進行卖氨,所以當在主線程調(diào)用了大量的 "+ (nullable UIImage *)imageNamed:(NSString *)name" 方法后就會產(chǎn)生卡頓会烙。(同時由于位圖體積較大,所以在磁盤緩存中不會直接緩存位圖數(shù)據(jù)筒捺,而是編碼壓縮過的PNG 或者JPG 數(shù)據(jù))