SDWebImageInfo
SDWebImage
简介
- iOS中著名的牛逼的网络图片处理框架
- 包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等
- 用法极其简单,功能十分强大,大大提高了网络图片的处理效率
- 国内超过90%的iOS项目都有它的影子
- 框架地址:https://github.com/rs/SDWebImage
获得框架
- 进入终端
- 输入以下命令
git clone --recursive https://github.com/rs/SDWebImage.git
第三方框架
介绍
- 由网络大牛来编写的框架程序
针对某一个具体的技术问题,提供完善的解决方案
特点
- 功能强大
- 有非常好的错误处理
持续升级维护
选择依据
- 看懂源程序
- 如果有时间,要尽量阅读常用框架的源程序并记录笔记
- 看人数
- 看口碑
- 如果大家都说好,那就大胆的用
使用
- 工作后,往死里用
- 学习中,尽量看懂源程序
- 获取框架
- http://github.com 全世界优秀的 iOS 第三方框架几乎都能找到
- 导入框架
- 直接拖拽
- 编译,由于绝大多数第三方框架会有对其他框架的依赖,先编译确认能够正常使用
- cocoapod
- 第三方框架管理工具
- 终端操作
- 后面会讲
- 直接拖拽
如何学习第三方框架
- 看官方文档
- 运行示例程序,找线索
- 利用
git分支添加注释 - 编写测试代码,整理学习笔记
- 阅读源程序(如果是用 C 语言编写的框架源程序不要看)
- 不要依赖谷歌/百度
- 因为第三方框架通常更新的很快,而网络文章要慢很多
- 有可能搜索到的一篇文章是很早以前版本的使用文档
学习第三方框架的好处
- 了解底层实现原理
- 发现自己的知识空缺点
- 学习新的实用技术
位移枚举
- 位移枚举是非常古老的 C 语言技巧
按位与如果都是 1 结果就是1按位或如果都是 0 结果就是0
演练
- 定义枚举类型
/// 操作类型枚举
typedef enum {
ActionTypeTop = 1 << 0,
ActionTypeBottom = 1 << 1,
ActionTypeLeft = 1 << 2,
ActionTypeRight = 1 << 3
} ActionType;
方法目标
- 根据操作类型参数,做出不同的响应
- 操作类型可以任意组合
方法实现
- (void)action:(ActionType)type {
if (type == 0) {
NSLog(@"无操作");
return;
}
if (type & ActionTypeTop) {
NSLog(@"Top %tu", type & ActionTypeTop);
}
if (type & ActionTypeBottom) {
NSLog(@"Bottom %tu", type & ActionTypeBottom);
}
if (type & ActionTypeLeft) {
NSLog(@"Left %tu", type & ActionTypeLeft);
}
if (type & ActionTypeRight) {
NSLog(@"Right %tu", type & ActionTypeRight);
}
}
- 方法调用
ActionType type = ActionTypeTop | ActionTypeRight;
[self action:type];
代码小结
- 使用
按位或可以给一个参数同时设置多个类型 - 在具体执行时,使用
按位与可以判断具体的类型 - 通过位移设置,就能够得到非常多的组合!
- 对于位移枚举类型,如果
传入 0,表示什么附加操作都不做,通常执行效率是最高的 - 如果开发中,看到位移的枚举,同时不要做任何的附加操作,参数可以直接输入 0!
iOS 特有语法
- iOS 5.0之后,提供了新的枚举定义方式
- 定义枚举的同时,指定枚举中数据的类型
typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions)
- 位移枚举,可以使用
按位或设置数值
- 位移枚举,可以使用
typedef NS_ENUM(NSInteger, UITableViewStyle)
- 数字枚举,直接使用枚举设置数值
typedef NS_OPTIONS(NSUInteger, ActionType) {
ActionTypeTop = 1 << 0,
ActionTypeBottom = 1 << 1,
ActionTypeLeft = 1 << 2,
ActionTypeRight = 1 << 3
};
NSCache
介绍
NSCache是苹果提供的一个专门用来做缓存的类- 使用和
NSMutableDictionary非常相似 - 是线程安全的
- 当内存
不足的时候,会自动清理缓存 - 程序开始时,可以指定缓存的
数量&成本
方法
取值
- (id)objectForKey:(id)key;
设置对象,0成本
- (void)setObject:(id)obj forKey:(id)key;
设置对象并指定
成本- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
成本示例,以图片为例:
- 方案一:缓存
100张图片 - 方案二:总缓存成本设定为
10M,以图片的宽 * 高当作成本,图像像素。这样,无论缓存的多少张照片,只要像素值超过 10M,就会自动清理 - 结论:在缓存图像时,使用成本,比单纯设置数量要科学!
- 方案一:缓存
删除
- (void)removeObjectForKey:(id)key;
删除全部(不要使用!)
- (void)removeAllObjects;
属性
@property NSUInteger totalCostLimit;- 缓存总成本
@property NSUInteger countLimit;- 缓存总数量
@property BOOL evictsObjectsWithDiscardedContent;- 是否自动清理缓存,默认是
YES
- 是否自动清理缓存,默认是
代码演练
- 定义缓存属性
@property (nonatomic, strong) NSCache *cache;
- 懒加载并设置限制
- (NSCache *)cache {
if (_cache == nil) {
_cache = [[NSCache alloc] init];
_cache.delegate = self;
_cache.countLimit = 10;
}
return _cache;
}
- 触摸事件添加缓存
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (int i = 0; i < 20; ++i) {
NSString *str = [NSString stringWithFormat:@"%d", i];
NSLog(@"set -> %@", str);
[self.cache setObject:str forKey:@(i)];
NSLog(@"set -> %@ over", str);
}
// 遍历缓存
NSLog(@"------");
for (int i = 0; i < 20; ++i) {
NSLog(@"%@", [self.cache objectForKey:@(i)]);
}
}
// 代理方法,仅供观察使用,开发时不建议重写此方法
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
NSLog(@"remove -> %@", obj);
}
修改网络图片框架
- 修改图像缓冲池类型,并移动到
.h中,以便后续测试
/// 图像缓冲池
@property (nonatomic, strong) NSCache *imageCache;
- 修改懒加载,并设置数量限制
- (NSCache *)imageCache {
if (_imageCache == nil) {
_imageCache = [[NSCache alloc] init];
_imageCache.countLimit = 15;
}
return _imageCache;
}
修改其他几处代码,将
self.imageCache[URLString]替换为[self.imageCache setObject:image forKey:URLString];测试缓存中的图片变化
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
for (AppInfo *app in self.appList) {
NSLog(@"%@ %@", [[DownloadImageManager sharedManager].imageCache objectForKey:app.icon], app.name);
}
}
- 注册通知,监听内存警告
- (instancetype)init
{
self = [super init];
if (self) {
// 注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearMemory) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
return self;
}
// 提示:虽然执行不到,但是写了也无所谓
- (void)dealloc {
// 删除通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- 清理内存
- (void)clearMemory {
NSLog(@"%s", __FUNCTION__);
// 取消所有下载操作
[self.downloadQueue cancelAllOperations];
// 删除缓冲池
[self.operationChache removeAllObjects];
}
注意:内存警告或者超出限制后,缓存中的任何对象,都有可能被清理。使用 NSCache 做缓存一定要保证能够有恢复的通道!
SDWebImageInfo的更多相关文章
随机推荐
- python智能图片识别系统(图片切割、图片识别、区别标识)
@ 目录 技术介绍 运行效果 关键代码 写在最后 技术介绍 你好! python flask图片识别系统使用到的技术有:图片背景切割.图片格式转换(pdf转png).图片模板匹配.图片区别标识. 运行 ...
- Centos7重置root密码(详细版)
修改了root密码,步骤如下: 步骤一:在开机出现如下界面的时候就按“e”键 步骤二:在步骤一按下”e”键之后,出现如下界面,按 ↓键一直到底部找到“LANG=zh_CN.UTF-8”这句,在 ...
- Salesforce学习笔记之Actions and Recommendations
设置Actions and Recommendations(Salesforce提供的标准元素),Salesforce上的文档说有两种方法,即Deployment和Process Builder(通过 ...
- Pycharm 2020.01亲测激活到2089年
Pycharm 2020.01亲测激活到2089年,注意是2020.01版本. 下载jetbrains-agent.jar 链接: https://pan.baidu.com/s/1w1i15pT38 ...
- linux驱动之内核多线程(四)
本文摘自 http://www.cnblogs.com/zhuyp1015/archive/2012/06/13/2548494.html 自己创建的内核线程,当把模块加载到内核之后,可以通过:ps ...
- 使用disk-image-builder(DIB)制作Ironic 裸金属镜像
export DIB_DEV_USER_USERNAME=centos export DIB_DEV_USER_PASSWORD= export DIB_DEV_USER_PWDLESS_SUDO=Y ...
- Vue 构造选项 - 进阶
Directive指令:减少DOM操作的重复 Vue实例/组件用于数据绑定.事件监听.DOM更新 Vue指令主要目的就是原生DOM操作 减少重复 自定义指令 两种声明方式 方法一:声明一个全局指令 V ...
- CSS 段落/换行/缩进
CSS 段落/换行/缩进 1.盒模型 box-sizing: content-box|border-box|inherit; content-box(默认) : 实际宽度/高度 = width/hei ...
- CAOZ:百度搜索引擎的人工干预的看法
http://www.wocaoseo.com/thread-247-1-1.html 百度确有人工干预的机制,但是这个机制与互联网上的传闻相差很大,人工干预的范围其实是非常小的,特别恶性的搜索结果, ...
- JavaScript面向对象的学习
1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...