SDWebImage框架学习
2016-01-13 本文已影响2648人
JoyceZhao
-
内部结构
- SDWebImageManager
- SDWebImageCache
- SDWebImageDownloader
- SDWebImageManagerDownloadOperation
- SDWebImageManager
-
框架的使用
- UIImageView+WebCache分类
-
简单下载图片
/* 第一个参数:图片的url 第二个参数:占位图片 缓存处理:内存缓存+磁盘缓存 - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder */
-
得到图片的下载进度
/* 第一个参数:图片的url 第二个参数:占位图片 第三个参数:下载图片的选项(策略) 第四个参数:progress进度回调 eceivedSize:已经下载的图片大小 expectedSize:图片的总大小 第五个参数:completed 下载完成(成功|失败)之后的回调 image:要下载的图片,如果错误的话,那么image = nil error:错误信息,如果错误的话 那么这个error有值 cacheType:缓存的类型 SDImageCacheTypeNone:没有使用缓存,图片是直接下载的 SDImageCacheTypeDisk:磁盘缓存 SDImageCacheTypeMemory:内存缓存 imageURL:图片的url 缓存处理:内存缓存+磁盘缓存 - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock */
-
- SDWebImageManager类
- 只是想简单的得到一张图片
/* 第一个参数:图片的url 第二个参数:下载图片的选项(策略) 第三个参数:progress进度回调 receivedSize:已经下载的图片大小 expectedSize:图片的总大小 第四个参数:completed 下载完成(成功|失败)之后的回调 image:要下载的图片,如果错误的话,那么image = nil error:错误信息,如果错误的话 那么这个error有值 cacheType:缓存的类型 SDImageCacheTypeNone:没有使用缓存,图片是直接下载的 SDImageCacheTypeDisk:磁盘缓存 SDImageCacheTypeMemory:内存缓存 imageURL:图片的url 缓存处理:内存缓存+磁盘缓存 -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionWithFinishedBlock)completedBlock */
- UIImage+GIF分类
- 播放本地的gif
// 使用UIImage的类方法 +(UIImage *)sd_animatedGIFNamed:(NSString *)name /* 内部原理: 1>把用户传入的gif图片转换为二进制数据流NSData 2>调用系统<ImageIO/ImageIO.h>的+(UIImage *)sd_animatedGIFWithData:(NSData *)data方法 2.1>系统方法根据NSData创建一个图片数据源 2.2>计算数据源中一共有多少帧,把每一帧数据取出放到图片数组中 2.3>根据得到的数组和计算好的动画时间得到动画,核心代码:animatedImage = [UIImage animatedImageWithImages:images duration:duration]; */
- SDWebImageDownloader类和UIImage+GIF分类
- 下载一张gif
// 1. 创建SDWebImageDownloader的单例对象 +(SDWebImageDownloader *)sharedDownloader // 2. SDWebImageDownloader单例对象调用下面方法下载gif /* 第一个参数:图片的url 第二个参数:下载图片的选项(策略) 第三个参数:progress进度回调 receivedSize:已经下载的图片大小 expectedSize:图片的总大小 第四个参数:completed 下载完成(成功|失败)之后的回调 image:要下载的图片,如果错误的话,那么image = nil error:错误信息,如果错误的话 那么这个error有值 cacheType:缓存的类型 SDImageCacheTypeNone:没有使用缓存,图片是直接下载的 SDImageCacheTypeDisk:磁盘缓存 SDImageCacheTypeMemory:内存缓存 imageURL:图片的url 缓存处理:不做缓存处理 注意点:completed回调是在子线程处理的,所以必须进行线程间的通信返回到主线程 -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock */ // 3. 在completed中调用下面方法显示gif图片 +(UIImage *)sd_animatedGIFWithData:(NSData *)data
- 处理接收到的系统的内存警告(面试)
- 采用监听系统警告通知的方式处理,接收到警告后清空缓存
- 代码实现
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application { //1.清空缓存 [[SDWebImageManager sharedManager].imageCache clearDisk]; [[SDWebImageManager sharedManager].imageCache cleanDisk]; //2.取消当前的下载操作 [[SDWebImageManager sharedManager] cancelAll];}
- clean和clear的区别(面试)
- clean:删除过期缓存(苹果官方规定最长的缓存周期是1周),计算当前缓存文件的总大小,比较设置的最大缓存,如果超出的话,那么就继续删除(按照缓存文件创建的顺序),直到小于最大缓存为止
- clear:简单粗暴 ,直接删除然后重新创建
- 使用注意事项
- 判断图片类型
+ (NSString *)sd_contentTypeForImageData:(NSData *)data
- 只判断图片二进制数据的第一个字节
- 队列里面任务的执行方式:先进先出
- 队列最大并发数是6
- 图片下载操作使用了NSURLConnection类发送网络请求实现
- 下载图片的请求超时时间:15s
- 缓存文件的命名的方式:使用URL字符串进行MD5加密
- 接受到内存警告之后,内部的处理方式:监听通知,删除内存缓存
- 内存缓存的处理方式:NSCache
- 判断图片类型
- UIImageView+WebCache分类
-
NSCache
- NSCache是专门用来进行缓存处理的,
- NSCache简单介绍:
- NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存
- 苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
建议:接收到内存警告时主动调用removeAllObject方法释放对象 - NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
- NSCache的Key只是对对象进行Strong引用,不是拷贝
- 属性介绍:
-
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;
//删除缓存中所有的对象
-
-
位移枚举
- 实现一个参数来传递多个参数
- 如果发现是位移枚举,而且第一个选项不是0,那么你可以默认传0,效率是最高的
- 定义位移枚举
typedef NS_OPTIONS(NSInteger, ZQActionType){ ZQActionTypeTop = 1<<0, ZQActionTypeBottom = 1<<1, ZQActionTypeLeft = 1<<2, ZQActionTypeRight = 1<<3,};
- 位移枚举的应用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self demo:ZQActionTypeTop|ZQActionTypeBottom|ZQActionTypeLeft|ZQActionTypeRight];} -(void)demo:(ZQActionType)type { NSLog(@"%zd",type); if(type & ZQActionTypeTop) { NSLog(@"向上--%zd",type & ZQActionTypeTop); } if(type & ZQActionTypeBottom) { NSLog(@"向下--%zd",type & ZQActionTypeBottom); } if(type & ZQActionTypeLeft) { NSLog(@"向左--%zd",ZQActionTypeLeft); } if(type & ZQActionTypeRight) { NSLog(@"向右---%zd",ZQActionTypeRight); } }