iOS中著名的牛逼的网络图片处理框架
包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等
用法极其简单,功能十分强大,大大提高了网络图片的处理效率
国内超过90%的iOS项目都有它的影子
进入终端
输入以下命令
git clone --recursive https://github.com/rs/SDWebImage.git
针对某一个具体的技术问题
,提供完善的解决方案持续
升级维护看懂源程序
看人数
看口碑
工作后,往死里用
学习中,尽量看懂源程序
获取框架
导入框架
直接拖拽
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 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
是苹果提供的一个专门用来做缓存的类
使用和 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;
懒加载并设置限制
触摸事件添加缓存
(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)]);
}
}
// 代理方法,仅供观察使用,开发时不建议重写此方法
修改图像缓冲池类型,并移动到 .h
中,以便后续测试
/// 图像缓冲池
@property (nonatomic, strong) NSCache *imageCache;
修改懒加载,并设置数量限制
修改其他几处代码,将 self.imageCache[URLString]
替换为 [self.imageCache setObject:image forKey:URLString];
测试缓存中的图片变化
注册通知,监听内存警告
// 提示:虽然执行不到,但是写了也无所谓
清理内存
(void)clearMemory {
NSLog(@"%s", FUNCTION);
// 取消所有下载操作
[self.downloadQueue cancelAllOperations];
// 删除缓冲池
[self.operationChache removeAllObjects];
}
注意:内存警告或者超出限制后,缓存中的任何对象,都有可能被清理。使用 NSCache 做缓存一定要保证能够有恢复的通道!
手机扫一扫
移动阅读更方便
你可能感兴趣的文章