SDWebImage 新版接口使用方法
2015-06-10 16:24
162 查看
最新的库结构如下初次导入,如果你的Xcode不是最新的,可能会遇到问题,解决版本(1)下载了SDWebImage.framework,然后拖到了工程中,然后:#import"UIImageView+WebCache.h"死活import不进啊,提示"UIImageView+WebCache.hfilenotfound"解决方法,最新版本的SDWebImage需要import的不是上面那一句了,需要:#import<SDWebImage/UIImageView+WebCache.h>然后build,一切OK。(2)另外一个问题就是:SymbolNotFound:_objc_storeStrong因为在noarc项目中引用了arc的SDWebImage,更改一下:BuildSettings->OtherLinkerFlags添加 ---------------------------------------------------------------------------第一步,在需要的地方导入头文件#import<SDWebImage/UIImageView+WebCache.h>第二步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。
除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:如上图中的UIImage+MultiFormat.m中/article/1822345.html
-fobjc-arc.
//1图片缓存的基本代码,就是这么简单 [self.image1sd_setImageWithURL:imagePath1];
//2用block可以在图片加载完成之后做些事情 [self.image2sd_setImageWithURL:imagePath2completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL){ NSLog(@"这里可以在图片加载完成之后做些事情"); }];
//3给一张默认图片,先使用默认图片,当图片加载完成后再替换 [self.image1sd_setImageWithURL:imagePath1placeholderImage:[UIImageimageNamed:@"default"]];
//4使用默认图片,而且用block在完成后做一些事情
[self.image1sd_setImageWithURL:imagePath1placeholderImage:[UIImageimageNamed:@"default"]completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL){NSLog(@"图片加载完成后做的事情");}];
//5options选择方式[self.image1sd_setImageWithURL:imagePath1placeholderImage:[UIImageimageNamed:@"default"]options:SDWebImageRetryFailed];
除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:
//覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应--------------------------如果想取出SD缓存在本地的图片,可以使用下面代码
SDWebImageManager*manager=[SDWebImageManagersharedManager];
[managerdownloadImageWithURL:imagePath2options:SDWebImageRetryFailedprogress:^(NSIntegerreceivedSize,NSIntegerexpectedSize){
NSLog(@"显示当前进度");
}completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,BOOLfinished,NSURL*imageURL){
NSLog(@"下载完成");
}];
NSURL*url=[NSURLURLWithString:[model.contentobjectForKey:@"image"]];--------------------------SDWebImage在从URL获取超过2m的图片时,会造成在内存小的机器上闪退,解决方法,重写一下内置的方法
//请求网络地址数据的同步方法
//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题
SDWebImageManager*manager=[SDWebImageManagersharedManager];
[managerdiskImageExistsForURL:url];
if([managerdiskImageExistsForURL:url]){
LOG(@"11111")
self.speakImage=[[managerimageCache]imageFromDiskCacheForKey:url.absoluteString];
}else{
LOG(@"3333333")
NSData*data=[NSDatadataWithContentsOfURL:url];
self.speakImage=[UIImageimageWithData:data];
}
+(UIImage*)sd_imageWithData:(NSData*)data{-----------------------------------------------------------------------------------SDWebImageDownloader这个下载器改版很大,现在里面就一个方法,就是发起前往下载图片的函数:
UIImage*image;
NSString*imageContentType=[NSDatasd_contentTypeForImageData:data];
if([imageContentTypeisEqualToString:@"image/gif"]){
image=[UIImagesd_animatedGIFWithData:data];
}
#ifdefSD_WEBP
elseif([imageContentTypeisEqualToString:@"image/webp"])
{
image=[UIImagesd_imageWithWebPData:data];
}
#endif
else{
image=[[UIImagealloc]initWithData:data];
UIImageOrientationorientation=[selfsd_imageOrientationFromImageData:data];
if(orientation!=UIImageOrientationUp){
image=[UIImageimageWithCGImage:image.CGImage
scale:image.scale
orientation:orientation];
}
}//------------------------------------------------------------
//这里是修改的代码,根据不同屏幕尺寸对图片进行裁切,使内存中图片占用较小
//------------------------------------------------------------
floatwidth=0.0;switch((int)[UIScreenmainScreen].bounds.size.width){
case320:
width=640.0;
break;
case375:
width=750.0;
break;
case414:
width=1242.0;
break;
default:
width=640.0;
break;
}//对网络图片进行缩放
floatscaleSize=width/image.size.width;if(scaleSize<1){UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));
[imagedrawInRect:CGRectMake(0,0,image.size.width*scaleSize,image.size.height*scaleSize)];
UIImage*scaledImage=UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();returnscaledImage;
}returnimage;
}
[[SDWebImageDownloadersharedDownloader]downloadImageWithURL:imageUrloptions:SDWebImageDownloaderProgressiveDownloadprogress:^(NSUIntegerreceivedSize,longlongexpectedSize){进度Block返回的信息有两个参数:1:下载进度.2:文件大小.我这里解释一下里面的options枚举的作用SDWebImageDownloaderOptions1:SDWebImageDownloaderLowPriority 这个属于默认的使用模式了,前往下载,返回进度Block信息,完成时调用completedBlock2:SDWebImageDownloaderProgressiveDownload 这个是新版本加的功能,设置后,在返回进度Block的同时,返回completedBlock,里面的UIImage就是当前下载时的图片,可以实现将图片一点点显示出来的功能.那么SDWebImageDownloader在新版本的中的分工很明确,只做一件事情,那就是下载,只是下载而已,所以,下载成功以后的图片资源是不会自动缓存的.如果要缓存,这里需要使用到SDImageCacheSDImageCacheType当下载请求结束时,通过这个枚举来告知图片的来源
NSLog(@"%u%lld",receivedSize,expectedSize);
}completed:^(UIImage*aImage,NSData*data,NSError*error,BOOLfinished){
//self.image=aImage;
NSLog(@"成功了:%d",UIImageJPEGRepresentation(aImage,1).length);
}];
1:SDImageCacheTypeNone网络2:SDImageCacheTypeDisk设备硬盘3:SDImageCacheTypeMemory内存将上面两步骤的需求合并可直接使用SDWebImageManager新版本的管理类的改动也相当大,而且就一个方法了,如下:
[[SDWebImageManagersharedManager]downloadWithURL:imageUrloptions:SDWebImageLowPriorityprogress:^(NSUIntegerreceivedSize,longlong,UIImageJPEGRepresentation(aImage,1).length);这样发起的下载请求,就会自动缓存图片资源了.那么任何发起的下载请求,都会返回一个代理.这个写法很神奇,值得深究啊.也就是:SDWebImageOperation将这个委托缓存一下,做什么用呢?一件事情,取消下载请求.这边文章介绍了整个SDWebImage的运作原理,真TMD的复杂
}];
相关文章推荐
- Android基础教程(三)之-----简单的Button事件响应综合提示控件Toast的应用
- MongoDB基本管理命令 [转]
- Golang Deco Enco
- 进程管理器中的chrome.exe *32是什么意思?
- 2015年6月10日 星期三 下午
- C语言 打印路径节点值的和为指定和的所有路径
- 云化应用还是应用云化?--【软件和信息服务】2015.05
- Windows套接字I/O模型(1) 套接字模式
- FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
- 二叉排序树的C++实现
- FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
- 参数嗅探(Parameter Sniffing)(2/2)
- 将博客搬至CSDN
- Jenkins + robot framework自动发送邮件报告
- 让你的软件永生,就靠这7个规则
- NSArray
- JAVA把字符串当作表达式运行
- webView 手势缩放以及自适应屏幕
- git 使用基础
- lirc红外学习irrecord