这儿每天分享一个 iOS 的新知识,快来重视我吧

前言

在日常开发中,对相同内容做重复的恳求没有什么含义而且还会影响应用程序的性能,因而经常会需求存储一些暂时内容,以便重用,例如从网络加载的图片、文件等。

Swift 中体系为我们供给了 NSCache,能够在内存中存储暂时数据。它是一个可变集合,以键值对的形式存储,而且 NSCache 自带铲除功用,这些键值对在资源缺乏时会被铲除。

很多第三方库的底层其实都在用 NSCache 做存储,比方常用的 Kingfisher,由于它非常的简略易用,又安全

运用方法

1. 初始化

NSCacheKeyValue 都是范型,因而需求在声明的时候指定其类型,比方我这儿存储的 keyNSStringvalueUIImage:

letcache=NSCache<NSString,UIImage>()

KeyValue 都必须是 AnyObject,因而值类型是不能用 NSCache 存储的

2. 增加目标到缓存

cache.setObject(UIImage(named:"apple.png")!,forKey:"apple")

3. 从缓存中获取目标

letimage=cache.object(forKey:"apple")

4. 设置缓存最大目标数

cache.countLimit=100

假如设置为 0,则不限制存储数量,默认值为 0

这个参数并不是一个严厉的限制,假如缓存超过了设置的限制,缓存中的目标可能会当即开释,也可能稍后开释,这取决于底层的完成细节。

5. 设置最大存储容量

cache.totalCostLimit=1024*1024*100

以上代码设置了 100MB 的存储容量,也就是说,假如超过了这个值,就会开端铲除缓存的目标。

6. 移除某个缓存

cache.removeObject(forKey:"apple")

7. 移除一切缓存

cache.removeAllObjects()

8. 行将被移除的署理监听

NSCache 还供给了一个署理,当目标行将从缓存中铲除或删去时调用,首先绑定署理:

cache.delegate=self

然后完成署理方法:

extensionViewController:NSCacheDelegate{
funccache(_cache:NSCache<AnyObject,AnyObject>,willEvictObjectobj:Any){
//obj缓存将要被移除时执行
}
}

NSCache 的优势

  1. 自动内存办理:当体系内存缺乏时,NSCache会自动删去部分缓存目标。

  2. 线程安全:能够在多个线程中同时运用,无需加锁。

  3. 键-值对存储:供给了相似 NSDictionary 的接口,但比 NSDictionary 更适合用作缓存。

NSCache 的缺陷

  1. 不可控性:这是最大的缺陷,苹果文档中也有描绘,即便你设置了 countLimittotalCostLimit,也不能确保何时铲除缓存或铲除哪些目标。

  2. 缺乏持久性:这些数据不是存储在磁盘上的,当应用程序重启后,缓存的数据将被清空。

  3. 无法设置过期时刻:与其他一些缓存机制比较,NSCache 无法为单个目标设置过期时刻,Kingfisher 中的过期时刻也是作者自己完成的。

这儿每天分享一个 iOS 的新知识,快来重视我吧

本文同步自微信公众号 “iOS新知”,每天按时分享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!