SDWebImage插件的使用(操作网络图片)

Posted on 2016-07-17 23:50  柠檬片  阅读(206)  评论(0)    收藏  举报

01 设置imageView的图片   (要引入头文件:#import "UIImageView+WebCache.h") 

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"]];

 1 //1.下载图片且需要获取下载进度
 2 //内存缓存&磁盘缓存
 3 -(void)download
 4 {
 5     [self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160221_306"] options:SDWebImageCacheMemoryOnly | SDWebImageProgressiveDownload progress:^(NSInteger receivedSize, NSInteger expectedSize) {
 6         
 7     } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
 8         
 9         switch (cacheType) {
10             case SDImageCacheTypeNone:
11                 NSLog(@"直接下载");
12                 break;
13             case SDImageCacheTypeDisk:
14                 NSLog(@"磁盘缓存");
15                 break;
16             case SDImageCacheTypeMemory:
17                 NSLog(@"内存缓存");
18                 break;
19             default:
20                 break;
21         }
22     }];
23     
24     NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]);
25     
26 }
给ImageView设置图片

 

 设置图片并计算下载进度       

//下载并设置图片    

/*     

第一个参数:要下载图片的url地址     

第二个参数:设置该imageView的占位图片     

第三个参数:传一个枚举值,告诉程序你下载图片的策略是什么     

第一个block块:获取当前图片数据的下载进度         

  receivedSize:已经下载完成的数据大小         

  expectedSize:该文件的数据总大小     

第二个block块:当图片下载完成之后执行该block中的代码         

image:下载得到的图片数据         

error:下载出现的错误信息         

SDImageCacheType:图片的缓存策略(不缓存,内存缓存,沙盒缓存)         

imageURL:下载的图片的url地址     

*/

   [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {        

//计算当前图片的下载进度        

NSLog(@"%.2f",1.0 *receivedSize / expectedSize);    

}

completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)

{    

}]; 

 

02.只需要简单获得一张图片,不设置(要引入头文件:#import "SDWebImageManager.h")

 1 //2.只需要简单获得一张图片,不设置
 2 //内存缓存&磁盘缓存
 3 -(void)download2
 4 {
 5     [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
 6         NSLog(@"%f",1.0 * receivedSize / expectedSize);
 7         
 8     } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
 9         
10         //得到图片
11         self.imageView.image = image;
12     }];
13 }
只需要简单获得一张图片,不设置

 

03.不需要任何的缓存处理(要引入头文件:#import "SDWebImageDownloader.h")

 1 //3.不需要任何的缓存处理
 2 //没有做任何缓存处理|
 3 -(void)download3
 4 {
 5     //data:图片的二进制数据
 6     [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
 7         
 8     } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
 9         //注意:此处作者没有做线程间的通信,所以我们要手动把设置图片的操作放到主线程里
10         [[NSOperationQueue mainQueue]addOperationWithBlock:^{
11              self.imageView.image = image;
12         }];
13        
14     }];
15 }
不需要任何的缓存处理

 

 04.设置gif图片(要引入头文件:#import "UIImage+GIF.h")

  内部实现:

    4-1 把用户传入的gif图片->NSData     

    4-2 根据该Data创建一个图片数据源(NSData->CFImageSourceRef)     

    4-3 计算该数据源中一共有多少帧,把每一帧数据取出来放到图片数组中     

    4-4 根据得到的数组+计算的动画时间-》可动画的image

1 //4.播放Gif图片
2 -(void)gif
3 {
4     NSLog(@"%s",__func__);
5     //self.imageView.image = [UIImage imageNamed:@"39e805d5ad6eddc4f80259d23bdbb6fd536633ca"];
6     
7     UIImage *image = [UIImage sd_animatedGIFNamed:@"39e805d5ad6eddc4f80259d23bdbb6fd536633ca"];
8     self.imageView.image = image;
9 }
设置gif图片

 

  05 系统级内存警告如何处理(面试)    

//取消当前正在进行的所有下载操作    

[[SDWebImageManager sharedManager] cancelAll];    

//清除缓存数据(面试)    

//    缓存周期:7天

//    clearDisk:删除文件夹,重新创建

//cleanDisk:删除过期的文件数据,计算当前未过期的已经下载的文件数据的大小,如果发现该数据大小大于我们设置的最大缓存数据大小,那么程序内部会按照按文件数据缓存的时间从远到近删除,知道小于最大缓存数据为止。    

//clearMemory:直接删除文件,重新创建新的文件夹    

//[[SDWebImageManager sharedManager].imageCache cleanDisk];    

[[SDWebImageManager sharedManager].imageCache clearMemory]; 

 

 1 -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
 2 {
 3     //1.清空缓存
 4     //clear:直接删除缓存目录下面的文件,然后重新创建空的缓存文件
 5     //clean:清除过期缓存,计算当前缓存的大小,和设置的最大缓存数量比较,如果超出那么会继续删除(按照文件了创建的先后顺序)
 6     //过期时间:7天
 7     [[SDWebImageManager sharedManager].imageCache clearMemory];
 8     
 9     //2.取消当前所有的操作
10     [[SDWebImageManager sharedManager] cancelAll];
11     
12     //3.最大并发数量 == 6
13     //4.缓存文件的保存名称如何处理? 拿到图片的URL路径,对该路径进行MD5加密
14     //5.该框架内部对内存警告的处理方式? 内部通过监听通知的方式请你缓存
15     //6.该框架进行缓存处理的方式:可变字典--->NSCache
16     //7.如何判断图片的类型: 在判断图片类型的时候,只匹配第一个字节
17     //8.队列中任务的处理方式:FIFO
18     //9.如何下载图片的? 发送网络请求下载图片,NSURLConnection
19     //10.请求超时的时间 15秒
20     
21     //[NSData dataWithContentsOfURL:<#(nonnull NSURL *)#>]
22 }
示例以及其他需要了解的

 

06 SDWebImage默认的缓存时间是1周

   

 

07 如何判断当前图片类型(要引入头文件:#import "NSData+ImageContentType.h") 

+ (NSString *)sd_contentTypeForImageData:(NSData *)data;