前言:最近在刷LeetCode时,遇到这样一道题,实现一个最近最少使用原则的实例, 146. LRU缓存机制, 👈这个,力扣146题,在我使用swift完成这道题之后,想着可以应用到iOS项目中,做一个用于内存管理的实例工具出来,于是便有了这个工具
实现原理:
工具使用双向链表和哈希表结合的方式,实现LRU的读取和存储;并针对iOS的特性,进行适当的封装,使用时可以直接把他当成是一个类似数组或者字典这样的存储类型,设置好上限阈值后,在存储数量到达阈值后,会自动清除最久未使用的内容,保证内存的高效利用,工具使用swift封装。
集成方式:
1. Cocoapods
pod 'AALURCache'
2. 直接下载GitHub# AALRUCache中的代码,将AALRUCache/AALRUCache/Classes
目录下的两个swift文件拖入工程使用(PS:纯swift类,OC无法使用)
使用方式:
1. 初始化实例
//AALRUCache<K: Hashable, V: Equatable>
//public init(_ capacity: Int) {
// maxCount = capacity
//}
let cache = AALRUCache<String, String>.init(20)
初始化的capacity参数为可以缓存的最大数量,初始化使用了两个范型来做类型约束,K为之后存取的键值类型,V为存取的数据类型。
2. 使用
- 存入有三种方法
cache["key"] = "value"
cache.put("key", "value")
cache.append("key", "value")
使用[]也就是subscript方法时,可以存入nil空值,如果该key值下有数据,数据会被删除,总体也和字典一致,已存在的key赋值会覆盖旧值
- 取出有两种方法
let value = cache["key"]
let value = cache.get("key")
如果该键值不存在,会返回nil空值
- 使用key值删除数据有两种方法
cache.remove("key")
cache["key"] = nil
key值不存在没有影响
3. 扩展
为了使功能更强大,在封装时,我将value的类型设置为Equatable
,然后使用swift的高阶函数,实现了从value获取key值的反向操作,当然如果value不唯一,返回的是哈希表最前面的key值
func key(for value: V) -> K? {
return dic.first(where: { (set) -> Bool in
return value == set.value.val
})?.key
}
使用者完全可以把这个工具当作一个字典来使用,可以存储基本数据类型和类实例,设置好内存数量上限之后,就会自动使用LRU原则管理存储的数据,这些使用者是无感的,非常简单好用,我们可以在很多需要动态加载大数量级数据的地方使用这个工具,他可以帮我们把内存控制在一个良好的状态下,推荐👍
欢迎集成和使用,联系方式:e2shao1993@163.com