1 设置imageView的图片 (内存缓存&磁盘缓存)
1 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"]];
2 设置图片另外几种方法
1 /*
2 第一个参数:要下载图片的url地址 3 第二个参数:设置该imageView的占位图片 4 第三个参数:传一个枚举值,告诉程序你下载图片的策略是什么 5 第一个block块:获取当前图片数据的下载进度 6 receivedSize:已经下载完成的数据大小 7 expectedSize:该文件的数据总大小 8 第二个block块:当图片下载完成之后执行该block中的代码 9 image:下载得到的图片数据 10 error:下载出现的错误信息 11 SDImageCacheType:图片的缓存策略(不缓存,内存缓存,沙盒缓存) 12 imageURL:下载的图片的url地址 13 */
14 [self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img5.duitang.com/uploads/item/201409/02/20140902150244_nMMEj.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160111_304"] options:(kNilOptions) progress:^(NSInteger receivedSize, NSInteger expectedSize) { 15 NSLog(@"%f",1.0 * receivedSize/expectedSize); 16 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {17 switch (cacheType) { 18 case SDImageCacheTypeNone: 19 NSLog(@"没有使用缓存,图片是直接下载的"); 20 break; 21 case SDImageCacheTypeDisk: 22 NSLog(@"磁盘缓存"); 23 break; 24 case SDImageCacheTypeMemory: 25 NSLog(@"内存缓存"); 26 break; 27 default: 28 break; 29 } 30 }];
1 //如果不需要占位图片,可以用如下代码 2 [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"http://img5.duitang.com/uploads/item/201409/02/20140902150244_nMMEj.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 3 NSLog(@"%f",1.0 * receivedSize/expectedSize); 4 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 5 self.imageView.image = image; 6 switch (cacheType) { 7 case SDImageCacheTypeNone: 8 NSLog(@"没有使用缓存,图片是直接下载的"); 9 break; 10 case SDImageCacheTypeDisk: 11 NSLog(@"磁盘缓存"); 12 break; 13 case SDImageCacheTypeMemory: 14 NSLog(@"内存缓存"); 15 break; 16 default: 17 break; 18 } 19 }];
1 //注意点:completed回调是在子线程处理的 2 //内部并不会做缓存处理 3 4 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"http://img.qqbody.com/uploads/allimg/201503/20150331222879.gif"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 5 NSLog(@"%f",1.0 * receivedSize/expectedSize); 6 7 } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { 8 9 //线程间通信 10 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 11 self.imageView.image = [UIImage sd_animatedGIFWithData:data]; 12 }]; 13 }];
3 系统级的内存警告如何处理
1 //取消当前正在进行的所有下载操作
2 [[SDWebImageManager sharedManager] cancelAll]; 3
4 //清除缓存数据 5 //cleanDisk:删除过期的文件数据,计算当前未过期的已经下载的文件数据的大小,如果发现该数据大小大于我们设置的最大缓存数据大小,那么程序内部会按照按文件数据缓存的时间从远到近删除,知道小于最大缓存数据为止。
6 [[SDWebImageManager sharedManager].imageCache cleanDisk]; 7
8 //clearMemory:直接删除文件,重新创建新的文件夹
9 [[SDWebImageManager sharedManager].imageCache clearMemory];
1 + (UIImage *)sd_animatedGIFNamed:(NSString *)name 2 + (UIImage *)sd_animatedGIFWithData:(NSData *)data
b.内部实现
1 /*
2 5-1 把用户传入的gif图片->NSData 3 5-2 根据该Data创建一个图片数据源(NSData->CFImageSourceRef) 4 5-3 计算该数据源中一共有多少帧,把每一帧数据取出来放到图片数组中 5 5-4 根据得到的数组+计算的动画时间 == 可动画的image 6 [UIImage animatedImageWithImages:images duration:duration]; 7 */
8 //如果图片帧数小于等于1,那么就直接把二进制数据转换为图片,并返回图片
9 if (count <= 1) { 10 animatedImage = [[UIImage alloc] initWithData:data]; 11 }else { 12 //创建可变的空的图片数组
13 NSMutableArray *images = [NSMutableArray array]; 14 //初始化动画播放时间为0
15 NSTimeInterval duration = 0.0f; 16 // 遍历并且提取所有的动画帧
17 for (size_t i = 0; i < count; i++) { 18 CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); 19 // 累加动画时长
20 duration += [self sd_frameDurationAtIndex:i source:source]; 21 // 将图像添加到动画数组
22 [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; 23 //释放操作
24 CGImageRelease(image); 25 } 26 //计算动画时间
27 if (!duration) { 28 duration = (1.0f / 10.0f) * count; 29 } 30 // 建立可动画图像
31 animatedImage = [UIImage animatedImageWithImages:images duration:duration]; 32 }
6 如何判断当前图片类型,只判断图片二进制数据的第一个字节
+ (NSString *)sd_contentTypeForImageData:(NSData *)data;
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
- (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
- (void)removeAllObjects;//删除缓存中所有的对象