• iOS启动图-从网络获取的gif图,在本地一直是没有动画,还模糊的


    背景介绍:
    APP启动页,常有静态图加链接,gif加链接,短视频等几种形式。
    我们APP前期只有静态图这一种,功能已经实现。
    之后,有了添加gif的需求,按理说,只要添加一个类型判断,按照数据类型,通过不同方法展示内容即可,但是一直不可以。。
    出了这样的问题,下好的gif图,内容类型没错但是通过对应的gif方法显示的内容一直是一张静态图,并且还是模糊的。
    因为之前的下载图片,以及显示图片的逻辑完全没问题,所以定位问题在显示gif的方法上,所以走了弯路,但是这条弯路是必然要走的。

    下面开始我们的星辰大海,我们的目标是终结问题
    先看源码--原来的代码

    /**
     *  下载新的图片
     */
    + (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName imgLinkUrl:(NSString *)imgLinkUrl imgDeadline:(NSString *)imgDeadline imgStartline:(NSString *)imgstartline
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
            UIImage *image = [UIImage imageWithData:data];
            
            
            NSString *filePath = [self getFilePathWithImageName:imageName]; // 保存文件的名称
            [UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES];
            if ([UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES]) {
                
                // 保存成功
                //判断保存下来的图片名字和本地沙盒中存在的图片是否一致,如果不一致,说明图片有更新,此时先删除沙盒中的旧图片,如果一致说明是删除缓存后再次下载,这时不需要进行删除操作,否则找不到已保存的图片
                if (![imageName isEqualToString:[[NSUserDefaults standardUserDefaults] objectForKey:adImageName] ]) {
                    [self deleteOldImage];
                }
               
                [[NSUserDefaults standardUserDefaults] setValue:imageName forKey:adImageName];
                [[NSUserDefaults standardUserDefaults] setValue:imageUrl forKey:adUrl];
                [[NSUserDefaults standardUserDefaults] setValue:imgDeadline forKey:adDeadline];
                 [[NSUserDefaults standardUserDefaults] setValue:imgstartline forKey:adstartline];
                //保存图片
    //            [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"Deadline"];
    //            [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"startline"];
                [[NSUserDefaults standardUserDefaults] synchronize];//立即写入
                
            }else{
                NSLog(@"保存失败");
            }
            
        });
    }
    
    /**
     *  通过在沙盒路径,获取gif图
     */
    -(void)setImgFilePath:(NSString *)imgFilePath{
          _imgFilePath = imgFilePath;
        if ([_imgFilePath hasSuffix:@"gif"]) {
             _adImageView.image = [UIImage sd_animatedGIFWithData:[NSData dataWithContentsOfFile:imgFilePath]];
        }else{
             _adImageView.image = [UIImage imageWithContentsOfFile:_imgFilePath];
        }
      
       
    }

    以上两个方法一个实现下载,一个实现显示,起初只有一张图片做启动图的时候,这种写法勉强用,虽然走了弯路,但是不会影响实现效果
    但是新需求是需要加载gif,或许以后还有小视频


    问题出来了
     gif一直下载不下来,起初修改了方法,毕竟gif有3M不小,所以换了下载方法,如下

    /**
     *  这个方法,下图片还行,你要是下载个大点的gif那就不合适了
     */
       NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
       UIImage *image = [UIImage imageWithData:data];
    


    那就改成下边的下载方法,适合稍大一点的文件下载

    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]]
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                                   if (!connectionError) {
                                       
                          
                                   } else {
                                       
                                   }
                               }];

    但是下载解决了问题后,发现还不能正常显示,但是项目中其他地方是没问题的啊,所以一直纠结于下面这个赋图的方法,其实是完全没问题的,只是能数据就不对了

     _adImageView.image = [UIImage sd_animatedGIFWithData:[NSData dataWithContentsOfFile:imgFilePath]];
    

     读取数据没问题,只能是存数据的时候不对了

    这个时候注意到,问题所在
     原因是下载的图片资源没有直接保存到某个路径下,而是先转成图片,然后图片转data保存了,多此一举了,重要的是,gif图的话,就把原来的资源都改变了,用的时候,获取的资源自然就出问题了,我们看代码

            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
            UIImage *image = [UIImage imageWithData:data];
            
            
            NSString *filePath = [self getFilePathWithImageName:imageName]; // 保存文件的名称
            [UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES];
            if ([UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES]){}

    这是下载图片方法中的存储功能代码:获取data,转image,image写成data保存。我们可以看到多了一步,可能图片的时候,虽然多转换一步,图片资源没有改变,但是gif图用[UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES];这个方法数据资源就改变了。所以导致图片虽然没问题,但是gif就不行了!

    这儿其实不管他是何种类型资源直接保存data就好了。

    下面是修改后的代码

    + (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName imgLinkUrl:(NSString *)imgLinkUrl imgDeadline:(NSString *)imgDeadline imgStartline:(NSString *)imgstartline
    {
        
        [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]]
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                                   if (!connectionError) {
                                       
                                       NSString *filePath = [self getFilePathWithImageName:imageName]; // 保存文件的名称
        
                                       //图片data直接存储,不需要转image然后再转data
                                       if ([data writeToFile:filePath atomically:YES]) {
                                           
                                           // 保存成功
                                           //判断保存下来的图片名字和本地沙盒中存在的图片是否一致,如果不一致,说明图片有更新,此时先删除沙盒中的旧图片,如果一致说明是删除缓存后再次下载,这时不需要进行删除操作,否则找不到已保存的图片
                                           if (![imageName isEqualToString:[[NSUserDefaults standardUserDefaults] objectForKey:adImageName] ]) {
                                               [self deleteOldImage];
                                           }
                                           
                                           [[NSUserDefaults standardUserDefaults] setValue:imageName forKey:adImageName];
                                           [[NSUserDefaults standardUserDefaults] setValue:imageUrl forKey:adUrl];
                                           [[NSUserDefaults standardUserDefaults] setValue:imgDeadline forKey:adDeadline];
                                           [[NSUserDefaults standardUserDefaults] setValue:imgstartline forKey:adstartline];
                                           //保存图片
                                           //            [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"Deadline"];
                                           //            [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"startline"];
                                           [[NSUserDefaults standardUserDefaults] synchronize];//立即写入
                                           
                                       }else{
                                           NSLog(@"保存失败");
                                       }
     
                                       
                                       
                                   } else {
                                       
                                   }
                               }];
        return;
    }

    测试之后,正常显示gif。。。问题得以解决!

    总结,问题往往就在你以为不可能出错的地方!

    作者流浪

    查看文章



  • 相关阅读:
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    Luogu P3975 [TJOI2015]弦论
    【模板】后缀自动机 (SAM)
    停用FF新鲜事/FF新推荐
    模板汇总
    Luogu P4467 [SCOI2007]k短路(模板)
    【模板】 最短路
    Luogu P5960 【模板】差分约束算法
  • 原文地址:https://www.cnblogs.com/widgetbox/p/7542253.html
Copyright © 2020-2023  润新知