iOS开发-NSCache
开发时,经常会遇到一个问题,从网络下载的图片应该如何来缓存?难道每次请求都要去下载一次?流量不要钱哇?所以比较好的方法就是把图片资源下载下来,保存到本地,然后下次直接从本地取出图片就可以了,但是用什么来保存这个图片呢?有些人可能说用NSDictionary(应该是NSMutableDictionary),因为这个类在开发中非常非常常用。但是其实可能有一个更好的选择,是专门为缓存来设计的,没错,就是NSCache。非常牛逼的AFN、SDWebImage都是用它来进行图片缓存的。
就像上边说到的,NSCache和NSDictionary很类似,用key-value键值对来存储,但是相对于NSDictionary,他有几点优势:
- 1.NSCache结合了各种自动删除的策略,用来确保不会占用过多的系统内存。
- 2.NSCache是线程安全的,在多线程情况下,不需要考虑加锁来保证数据的安全。
- 3.不像NSMutableDictionary,NSCache不会copy对象,而是保留它。
NSCache 框架
NSCache的类中内容很少,从Xcode进去看也就只有43行,接下来我们来看一下他都提供了哪些方法和属性。
NSCache 的属性
|
|
countLimit
用来限制缓存最多维护的对象个数,默认为0,0表示不限制数量。
但是需要注意的是,这个限制并不是严格的限制,如果缓存的数量超过这个数量,缓存中的一个对象可能会被立即丢弃,也可能稍候丢弃,还可能永远都不会丢弃,具体还要看实现的方式。
|
|
totalCostLimit
用来限制缓存最大能够维持的内存,默认也为0,表示没有限制。
一般我们会使用字节来作为cost进行限制,在添加缓存时可以指定写入的缓存的cost,当总消耗的cost值超过限制时,就会释放一些缓存对象,这个释放对象的选择使用LRU(Least Recently Used)算法来选择最近没有使用的对象进行淘汰。
NSCache 方法
NSCache的存取方法主要是用key-value的形式,存取方法分为set、get、remove三种类型。
|
|
其中
|
|
可以指定消耗的cost,配合之前的totalCostLimit
来管理缓存大小。
NSCacheDelegate
NSCacheDelegate只有一个方法:
|
|
当代理对象即将从缓存中移除时激活。
NSCache 使用
NSCache的使用很简单。
实例化一个cache对象,然后设定缓存内容就可以了,但是我们
|
|
然后添加一个按钮,在点击时获取缓存
|
|
可以看到打印出来的内容:
|
|
发现还是有10个图片被保存了下来,这时候我们把限制的cost大小和存入cost的方法修改一下。
|
|
打印结果:
|
|
发现只有最后一次的图片被缓存下来了。
最后
以上就是NSCache的全部内容了,这个类中的内容不多,但是可能会在开发时帮助我们解决很多麻烦的问题。
原文地址:https://www.cnblogs.com/sanxiandoupi/p/11692185.html
- Flash/Flex学习笔记(25):摩擦力与屏幕环绕
- 搞事情!富士通和微软强强联手用AI加速工作方式转变
- MySQL管理工具HeidiSQL
- Centos 使用YUM安装MariaDB
- Div Scroll Bar (用层模拟滚动条)
- WordPress免插件仅代码实现文章浏览次数的方法(3)
- 定义新智慧,这AI很“远景X3”
- WordPress删除头部wp_head()多余代码
- 域名fde.com在国内平台以11万元被秒
- 微信小程序助力实体店对接互联网市场
- PostgreSQL 与 MySQL 相比,优势何在?
- Setting Up KeePass For Centos 6
- 拼音米大热!快视”、“冰冰”等多个域名结拍
- 入门必读:Hadoop新手学习指导
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux Bash基础(二)
- poiAndEasyExcel学习(二)
- poiAndEasyExcel学习(三)
- poiAndEasyExcel学习(四)
- 使用OpenCV为视频中美女加上眼线
- 论文精读|5th|YOLO v3的新特性|目标检测|附下载
- 算法集锦(9)|自动驾驶|道路图像增强算法
- 基于OpenCV实现海岸线变化检测
- 爬取bilibili再也不用头疼了,bilibili-api一步到位!
- 「React」很多人在滥用 state
- == 与equals和hashCode与equals
- 算法集锦(10)| 自动驾驶、机器人 | 物品图像动态检测算法实现
- Hystrix仪表盘
- Centos7 Nginx的SSL证书安装
- 算法集锦(11)| 自动驾驶 | 基于HOG和SVM的车辆识别算法