LRUCache 是 NSCache
的开源替代品,其行为可预测且易于调试。LRUCache 是一种 LRU(最近最少使用)缓存,这意味着对象将根据上次访问时间以最旧优先的顺序丢弃。LRUCache 会在发生内存警告时自动清空自身。
LRUCache 以动态框架的形式打包,您可以将其导入到您的 Xcode 项目中。您可以手动安装,也可以使用 Swift Package Manager 安装。
注意: LRUCache 需要 Xcode 10+ 才能构建,并在 iOS 10+ 或 macOS 10.12+ 上运行。
要使用 Swift Package Manager 安装,请将以下内容添加到 Package.swift 文件中的 dependencies:
部分
.package(url: "https://github.com/nicklockwood/LRUCache.git", .upToNextMinor(from: "1.0.5")),
您可以按如下方式创建 LRUCache 的实例
let cache = LRUCache<String, Int>()
这将创建一个大小不受限制的缓存,其中包含由 String
键入的 Int
值。要向缓存添加值,请使用
cache.setValue(99, forKey: "foo")
要获取缓存的值,请使用
let value = cache.value(forKey: "foo") // Returns nil if value not found
要获取缓存中存储的所有键或值,请使用
let keys = cache.allKeys // Ordered from oldest to newest
let values = cache.allValues // Ordered from oldest to newest
您可以通过计数或成本来限制缓存大小。这可以在初始化时完成
let cache = LRUCache<URL, Date>(totalCostLimit: 1000, countLimit: 100)
或在缓存创建后完成
cache.countLimit = 100 // Limit the cache to 100 elements
cache.totalCostLimit = 1000 // Limit the cache to 1000 total cost
成本是应用程序定义的任意大小度量。对于文件或数据缓存,您可以将成本基于字节大小或您喜欢的任何指标。要指定存储值的成本,请使用可选的 cost
参数
cache.setValue(data, forKey: "foo", cost: data.count)
当超出计数或成本限制时,值将自动从缓存中删除。您也可以使用以下方法显式删除值
let value = cache.removeValue(forKey: "foo")
或者,如果您不需要该值,可以通过将其设置为 nil
来删除
cache.setValue(nil, forKey: "foo")
您可以立即删除所有值,使用
cache.removeAllValues()
在 UIKit 可用的平台(iOS、tvOS 和 visionOS)上,缓存在发生内存警告时会自动清空。
LRUCache 内部使用 NSLock
来确保变更是原子性的。因此,从多个线程并发访问单个缓存实例是安全的。
从缓存中读取、写入和删除条目都在恒定时间内完成。当缓存已满时,由于每次插入新值时都需要删除元素,因此插入时间会略有下降。但这仍然应该是恒定时间的,但是添加具有较大成本的值可能会导致多个低成本值被逐出,这将花费与受影响值数量成正比的时间。
LRUCache 框架主要由 Nick Lockwood 完成。
(贡献者完整列表)