SDWebImageInfo

SDWebImage

简介

  • iOS中著名的牛逼的网络图片处理框架
  • 包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等
  • 用法极其简单,功能十分强大,大大提高了网络图片的处理效率
  • 国内超过90%的iOS项目都有它的影子
  • 框架地址:https://github.com/rs/SDWebImage

获得框架

  • 进入终端
  • 输入以下命令
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 特有语法

  • 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 做缓存一定要保证能够有恢复的通道!

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
学校大创竞赛管理系统,学生上报项目内容,学院、教务处、评审专家评审。SpringBoot、SpringCloud、SpringSecurity、redis、Mysql、swagger、fastdfs、maven、vue、webpack.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值