您的位置:首页 > 其它

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添加
-fobjc-arc
.
---------------------------------------------------------------------------第一步,在需要的地方导入头文件#import<SDWebImage/UIImageView+WebCache.h>第二步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。
//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的时候响应
SDWebImageManager*manager=[SDWebImageManagersharedManager];
[managerdownloadImageWithURL:imagePath2options:SDWebImageRetryFailedprogress:^(NSIntegerreceivedSize,NSIntegerexpectedSize){
NSLog(@"显示当前进度");
}completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,BOOLfinished,NSURL*imageURL){
NSLog(@"下载完成");
}];
--------------------------如果想取出SD缓存在本地的图片,可以使用下面代码
NSURL*url=[NSURLURLWithString:[model.contentobjectForKey:@"image"]];
//请求网络地址数据的同步方法
//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题
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];
}
--------------------------SDWebImage在从URL获取超过2m的图片时,会造成在内存小的机器上闪退,解决方法,重写一下内置的方法如上图中的UIImage+MultiFormat.m中
+(UIImage*)sd_imageWithData:(NSData*)data{
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;
}
-----------------------------------------------------------------------------------SDWebImageDownloader这个下载器改版很大,现在里面就一个方法,就是发起前往下载图片的函数:
[[SDWebImageDownloadersharedDownloader]downloadImageWithURL:imageUrloptions:SDWebImageDownloaderProgressiveDownloadprogress:^(NSUIntegerreceivedSize,longlongexpectedSize){
NSLog(@"%u%lld",receivedSize,expectedSize);
}completed:^(UIImage*aImage,NSData*data,NSError*error,BOOLfinished){
//self.image=aImage;
NSLog(@"成功了:%d",UIImageJPEGRepresentation(aImage,1).length);
}];
进度Block返回的信息有两个参数:1:下载进度.2:文件大小.我这里解释一下里面的options枚举的作用SDWebImageDownloaderOptions1:SDWebImageDownloaderLowPriority  这个属于默认的使用模式了,前往下载,返回进度Block信息,完成时调用completedBlock2:SDWebImageDownloaderProgressiveDownload  这个是新版本加的功能,设置后,在返回进度Block的同时,返回completedBlock,里面的UIImage就是当前下载时的图片,可以实现将图片一点点显示出来的功能.那么SDWebImageDownloader在新版本的中的分工很明确,只做一件事情,那就是下载,只是下载而已,所以,下载成功以后的图片资源是不会自动缓存的.如果要缓存,这里需要使用到SDImageCacheSDImageCacheType当下载请求结束时,通过这个枚举来告知图片的来源
1:SDImageCacheTypeNone网络2:SDImageCacheTypeDisk设备硬盘3:SDImageCacheTypeMemory内存
将上面两步骤的需求合并可直接使用SDWebImageManager新版本的管理类的改动也相当大,而且就一个方法了,如下:
[[SDWebImageManagersharedManager]downloadWithURL:imageUrloptions:SDWebImageLowPriorityprogress:^(NSUIntegerreceivedSize,longlong,UIImageJPEGRepresentation(aImage,1).length);
}];
这样发起的下载请求,就会自动缓存图片资源了.那么任何发起的下载请求,都会返回一个代理.这个写法很神奇,值得深究啊.也就是:SDWebImageOperation将这个委托缓存一下,做什么用呢?一件事情,取消下载请求.这边文章介绍了整个SDWebImage的运作原理,真TMD的复杂/article/1822345.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: