zoukankan      html  css  js  c++  java
  • 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();
                                         }
                                     }
                                 }];
        }
    }
  • 相关阅读:
    Oracle基础操作
    Linux的常用命令
    Javascript 上课笔记
    Linux操作指令
    css样式分类
    DW
    标准sql执行顺序
    Mysql数据库
    模拟课----需求文本
    php 发送邮件
  • 原文地址:https://www.cnblogs.com/wangkejia/p/10065213.html
Copyright © 2011-2022 走看看