Build Codecov Platforms Swift 5.1 License Mastodon

简介

LRUCacheNSCache 的开源替代品,其行为可预测且易于调试。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 完成。

(贡献者完整列表)