********
最近做的一個項目,裡面有這樣一個需求,在一個頁面,用一個UIImageView不停的重新整理顯示圖檔,圖檔可能會重複顯示;圖檔是從伺服器下載下傳下來的data流,data轉UIimage系統的方法:
UIImage *image = [UIImage imageWithData:data];
這個方法并不好,用過 SDWebImage 的都知道為什麼不好,既然圖檔是伺服器下載下傳,而且圖檔可以重複,那就用 SDWebImage 做緩存,下次請求可以用圖檔唯一标示先從本地拿,如果有,就不用再請求,直接傳回就行,下面是圖檔下載下傳成功後傳回的 responseObject data流 :
UIImage *responseImage = [UIImage sd_imageWithData:responseObject];
[[SDImageCache sharedImageCache] storeImage:responseImage forKey:@"imageKey-圖檔唯一标示" completion:nil];
緩存過後,我再用 responseImage 指派給 UIImageView 的image :
imageView.image = responseImage;
然後開始測試,接着就發現了一個問題,再請求切換圖檔時【圖檔不重複】,運作記憶體一直在增加,當我把 imageView.image = responseImage; 這行注釋掉之後,記憶體一切正常;發現如果将請求拿到的 responseImage 直接指派給 imageView 就出出現這個記憶體暴漲問題,接着我做了以下修改,拿到 responseImage 并将其緩存如本地後,再用 SDImageCache 取出來一個緩存過的新UIIImage:imageResponseCache,再将 imageResponseCache 指派給 imageView:
UIImage *responseImage = [UIImage sd_imageWithData:responseObject];
[[SDImageCache sharedImageCache] storeImage:responseImage forKey:@"imageKey-圖檔唯一标示" completion:nil];
UIImage *imageResponseCache = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:@"imageKey-圖檔唯一标示"];
imageView.image =imageResponseCache;
通過上述實作,記憶體一切正常。
多圖下載下傳簡易處理
+ (void)downloadImages:(NSArray<NSString *> *)imgUrlArray
completion:(void(^)(void))completionBlock{
__block NSInteger count = 0;
SDWebImageDownloader *manager = [SDWebImageDownloader sharedDownloader];
manager.downloadTimeout = 30;
for(int i=0; i< imgUrlArray.count;i++) {
NSString *imgUrl = [imgUrlArray objectAtIndex:i];
[manager downloadImageWithURL:[NSURL URLWithString:imgUrl]
options:SDWebImageDownloaderUseNSURLCache|SDWebImageDownloaderScaleDownLargeImages
progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
if(finished){
count = count + 1;
if(!error && image){
[[SDImageCache sharedImageCache] storeImage:image forKey:imgUrl toDisk:YES completion:nil];
// NSLog(@"下載下傳成功 %ld=%@",count,imgUrl);
}
else{
// NSLog(@"下載下傳失敗 %ld=%@",count,imgUrl);
}
if(count == imgUrlArray.count) {
// NSLog(@"全部下載下傳完成");
//全部下載下傳完成
return completionBlock();
}
}
}];
}
}