第三方框架 - 03.SDWebImage框架

1.SDWebImage框架概述


2.基本使用

  • 直接下载一张图片
    NSURL *url = [NSURL URLWithString:@"http://cdn.7kk.com/201409/23/s422449525930644310.jpg"];
    // 创建SDWebImageManager对象
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    // 下载图片
    /* 参数解释
     第一个参数:传入下载图片的资源地址
     第二个参数:下载的配置信息(例如是否需要缓存等等)
     第三个参数:下载过程中的回调
     第四个参数:下载完成后的回调
     */
    [manager downloadImageWithURL:url options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        /*参数解释
         receivedSize:已经接受到的数据大小
         expectedSize:需要下载的图片的总大小
         */
        NSLog(@"正在下载 %zd %zd", receivedSize, expectedSize);
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        /* 参数解释
         image:下载好的图片
         error:错误信息
         cacheType:缓存的类型
         finished:是否下载完成
         imageURL:被下载的图片的地址
         */
         NSLog(@"下载成功 %@", image);
    }];

3.再次实现此前在介绍SDWebImage实现原理中cell的图片缓存问题

  • 一行代码解决
  • 只要传入需要下载的图片的URL以及占位图片即可下载和自动缓存图片
  • 图片缓存目录是在应用沙盒Library/Caches下,新建了一个名为default的文件夹,并且在该目录下新建子目录com.hackemist.SDWebImageCache.default中缓存图片
 // 在老版本的SDWebImage中, 以下方法是没有sd_前缀的
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:dict[@"icon"]] placeholderImage:[UIImage imageNamed:@"abc"]];

4.SDWebImage的缓存处理机制

  • 1.自动进行内存缓存和磁盘缓存
    • 在正常状况下,SDWebImage的磁盘缓存,是按照时间来处理的, 只要缓存数据超过了最大的缓存时间, 就会自动删除
    • SDWebImage默认的磁盘缓存时间是1周
  • 2.SDWebImage接收到内存警告后,就会调用clearMemory方法,清空内存缓存
  • 3.SDWebImage即将要被终结时,会调用cleanDisk方法,删除过期的文件
  • 4.SDWebImage缓存清空机制
    • 调用clearMemory方法,移除NSCache中保存的所有图片对象
  • 5.SDWebImage磁盘清空机制
    • cleanDisk : 清除过期的
      • 遍历缓存目录, 找到所有过期的文件, 并删除
      • 查看当maxCacheSize的值, 如果删除之后缓存的大小, 还大于maxCacheSize, 那么就会从时间较早的开始继续删除, 直到缓存大小小于maxCacheSize为止
    • clearDisk : 清除所有
      • 直接干掉缓存文件夹
      • 重新创建一个新的文件夹, 作为缓存文件

5.其他功能介绍

  • 1.SDWebImage可以直接播放GIF图片
    • 加载GIF图片, 然后取出GIF图片中所有的帧, 并且计算动画时间
    • 根据取出的帧和动画时间生产一张新的可动画的图片
    • 打开SDWebImage源文件中有一个分类UIImage+GIF.h
// 根据传入的gif图片名称和gif的二进制数据生产可动画的图片
+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
// 内部实现原理就是我上面说明的原理,若是有兴趣可以去查看源文件内部具体实现
  • 2.SDWebImage它可以判断图片的类型
    • 图片的十六进制数据, 的前8个字节都是一样的, 所以可以同判断十六进制来判断图片的类型,具体内部实现细节请参考如下代码,或者去源文件中查看
    • kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}
// 源文件中有一个NSData+ImageContentType.h的分类
// 提供了一个根据传入的图片的二进制数据判断当前图片的类型
// 这里只取出图片十六进制数据的第一个字节来判断
+ (NSString *)sd_contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return @"image/jpeg";
        case 0x89:
            return @"image/png";
        case 0x47:
            return @"image/gif";
        case 0x49:
        case 0x4D:
            return @"image/tiff";
        case 0x52:
            // R as RIFF for WEBP
            if ([data length] < 12) {
                return nil;
            }
            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return @"image/webp";
            }
            return nil;
    }
    return nil;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值