文档章节

使用 SDWebImageDownloader 过程中遇到的问题小结

木木情深
 木木情深
发布于 2015/06/16 11:39
字数 444
阅读 36
收藏 0

问题一、      

业务场景:设定imageView进行网络图片加载的过程中,默认图片为imageA,加载失败图片为imageB    

问题:      imageView的图片或者为imageA,没有如期的显示为失败图片iamgeB    

代码分析:有的时候图片的url是正确的,但是网络请求的ReceiveData的总长度为0,导致image为nil。

解决方案:添加红色标注的位置,即可轻松解决问题。

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection

{

    self.connection = nil;


    [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil];


    if ([delegate respondsToSelector:@selector(imageDownloaderDidFinish:)])

    {

        [delegate performSelector:@selector(imageDownloaderDidFinish:) withObject:self];

    }


    if ([delegate respondsToSelector:@selector(imageDownloader:didFinishWithImage:)])

    {

        if (imageData.length == 0) {

            if ([delegate respondsToSelector:@selector(imageDownloader:didFailWithError:)])

            {

                [delegate performSelector:@selector(imageDownloader:didFailWithError:) withObject:self withObject:nil];

            }

            

            self.connection = nil;

            self.imageData = nil;

        }

        UIImage *image = SDScaledImageForPath(url.absoluteString, imageData);

        [[SDWebImageDecoder sharedImageDecoder] decodeImage:image withDelegate:self userInfo:nil];

    }

}

问题二、      

业务场景:设定imageView进行网络图片加载的过程中

问题:      因图片数量过多、size多大造成内存溢出    

代码分析:没有做图片的缩放处理

解决方案:修改SDWebImageDecoder.m 中添加红色所示的方法,即可轻松解决问题。

//从原点开始重新绘图

+ (UIImage *)decodedImageWithImage:(UIImage *)image

{

    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image.CGImage);

    BOOL imageHasAlphaInfo = (alphaInfo != kCGImageAlphaNone &&

                              alphaInfo != kCGImageAlphaNoneSkipFirst &&

                              alphaInfo != kCGImageAlphaNoneSkipLast);


    UIGraphicsBeginImageContextWithOptions(image.size, !imageHasAlphaInfo, 0);

    CGRect rect = (CGRect){.origin = CGPointZero, .size = image.size};

    [image drawInRect:rect];

    UIImage *decompressedImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();


    return decompressedImage;

}


//缩放

+(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize

{

    // Create a graphics image context

    UIGraphicsBeginImageContext(newSize);

    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;

}


© 著作权归作者所有

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
SDWebImage源码解读(二)

今天总计一下SDWebImage核心模块之下载模块。下载模块主要包括两个类SDWebImageDownloader和SDWebImageDownloaderOperation。其中SDWebImageDownloader负责对所有下载任务的管理,SDWebImag...

智小融
07/02
0
0
搬好小板凳看SDWebImage源码解析(二)

4>SDWebImageDownloader SDWebImageDownloader是以单例存在,对图片下载管理,进行一些全局的配置。如下: 1).设置最大并发数,下载时间默认15秒,是否压缩图片和下载顺序等。 2).设置opera...

厦大
2017/12/18
0
0
iOS 图片加载框架SDWebImage详解

目的 在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们就需要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成...

FBY展菲
2017/10/31
0
0
第三方库:SDWebImage简单使用

官方接口文档地址:http://cocoadocs.org/docsets/SDWebImage/3.8.1/ SDWebImage 提供了一个支持网络下载图片的UIImageView的分类,主要有以下功能: 为Cocoa Touch框架提供一个UIImageView...

xiaobai1315
2016/09/06
33
0
SDWebImage详细使用

SDWebImage托管在github上。https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征...

xiaobai1315
2016/08/26
9
0

没有更多内容

加载失败,请刷新页面

加载更多

day92-20180918-英语流利阅读-待学习

健身最大的敌人不是懒惰,而是逞强 Daniel 2018-09-19 1.今日导读 还记得 2008 年北京奥运会运动员刘翔的退赛风波吗?那天几乎所有中国人都将视线聚焦在了鸟巢体育馆 110 米栏的项目上,迫不...

飞鱼说编程
25分钟前
2
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部