iOS-關於緩存【SDImageCache】Image,一直刷新UIImageView內存一直增加問題【多圖片下載簡易處理】


********

最近做的一個項目,里面有這樣一個需求,在一個頁面,用一個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();
                                     }
                                 }
                             }];
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM