1.SDWebImage框架概述
2.基本使用
NSURL *url = [NSURL URLWithString:@"http://cdn.7kk.com/201409/23/s422449525930644310.jpg"];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:url options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"正在下载 %zd %zd", receivedSize, expectedSize);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
NSLog(@"下载成功 %@", image);
}];
3.再次实现此前在介绍SDWebImage实现原理中cell的图片缓存问题
- 一行代码解决
- 只要传入需要下载的图片的URL以及占位图片即可下载和自动缓存图片
- 图片缓存目录是在应用沙盒Library/Caches下,新建了一个名为default的文件夹,并且在该目录下新建子目录com.hackemist.SDWebImageCache.default中缓存图片
[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
+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
- 2.SDWebImage它可以判断图片的类型
- 图片的十六进制数据, 的前8个字节都是一样的, 所以可以同判断十六进制来判断图片的类型,具体内部实现细节请参考如下代码,或者去源文件中查看
- kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}
+ (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:
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;
}