iOS多线程-SDWebImage简单介绍 1 设置imageView的图片 (内存缓存&磁盘缓存) 1 [cell.imageView sd_setImageWithURL:[NSURL URL

iOS多线程-SDWebImage简单介绍

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];
复制代码
   4 SDWebImage默认的缓存时间是1周 
 
   5 如何播放gif图片内部实现 
      a.方法
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;
7 SDWebImage内部结构


1.SDWebImage相关知识点补充
  1.SDWebImage接收到内存警告的时候如何处理?采用监听系统警告通知的方式处理,接收到警告后清空缓存 
  2.SDWebImage队列最大并发数为6
  3.SDWebImage内部设置下载图片超时时间为15m
  4.SDWebImage图片下载操作使用了NSURLConnection类发送网络请求实现
  5.SDWebImage内部使用NSCache类来进行缓存处理
  6.SDWebImage内部如何判断图片类型?判断该图片二进制数据的第一个字节
  7.沙盒缓存图片的命名方式为对该图片的URL进行MD5加密  (Mac终端输入:echo -n "url" |MD5 可获得MD5密文)
  8. 图片的下载顺序,默认是先进先出的
 
2.NSCache知识点补充
 1.NSCache是专门用来进行缓存处理的,
 2.NSCache简单介绍:
    2-NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似,在AFNSDWebImage框架中被使用来管理缓存
    2-苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
        建议:接收到内存警告时主动调用removeAllObject方法释放对象
    2-NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
    2-NSCacheKey只是对对象进行Strong引用,不是拷贝
 3 属性介绍:
    name:名称
    delegete:设置代理
    totalCostLimit:缓存空间的最大总成本,超出上限会自动回收对象。默认值为0,表示没有限制
    countLimit:能够缓存的对象的最大数量。默认值为0,表示没有限制
    evictsObjectsWithDiscardedContent:标识缓存是否回收废弃的内容
  方法介绍
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
- (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
- (void)removeAllObjects;//删除缓存中所有的对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值