测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年6月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 John Bailey 维护。
Swift 开发通用的树形对象缓存。
Hoard 的目的是提供一种树形结构而非平面映射结构为基础的简单对象缓存。Hoard 缓存利用嵌套上下文和分段键来支持树形结构。Hoard 缓存的另一个特点是,对于 get
请求的调用者可以提供一个选择性的加载闭包来加载和放置未找到的项。这可以同步或异步执行,为透传缓存提供了坚实的基础。
将 Hoard Pod 添加到 Podfile。
target 'MyTarget' do
pod 'Hoard'
end
务必使用你的 Xcode 项目的目标而不是‘MyTarget’。在添加这些行后,在终端应用中导航到包含 Podfile 的文件夹。现在,通过执行命令 pod install
来安装 pod(以及任何其他必需的项目依赖项)
此时,你应该准备好使用 Swift 框架导入与库进行交互
import Hoard
或使用 Objective-C 框架
@import Hoard;
所有项都使用分段键存储在缓存中。每个键段表示树中的一个分支,除了最后一个键段通常被视为树的叶子节点。
创建 Key
的主要方式是使用 Key.from
函数。
简单
let key = Key.from("somekey")
复杂
let key = Key.from("root", "branch", "leaf")
为了简化键的使用,缓存可以使用任何符合 Keyable
协议的东西。这允许与分段键的全支持进行简单交互。Hoard 为 String
和 NSURL
提供了 Keyable
扩展。这两个都会创建代表路径结构的复杂键。因此,字符串将用 /
字符隔开,并无需将 URL 处理成相同方式,它们还将包括任何主机信息作为其根段。
字符串路径
let keyOne = "somekey".asKey()
let keyTwo = Key.from("somekey")
assert(keyOne == keyTwo)
let keyOne = "root/branch/leaf".asKey()
let keyTwo = Key.from("root", "branch", "leaf")
assert(keyOne == keyTwo)
URLs
let url = NSURL(string: "http://cdn.google.com/some/asset.png")!
let keyOne = url.asKey()
let keyTwo = Key.from("cdn.google.com", "some", "asset.png")
assert(keyOne == keyTwo)
Context
协议代表树中的一个位置,用于存储项。所有关于 Context
的主要功能都需要一个 Keyable
来操作。更有趣的是上下文的树状结构。上下文中的一个项可以是另一个上下文,并创建多个分支。这些嵌套分支可以实现不同的行为,并且可以被独立地操作。
放置项的方式与预期相同。您只需使用键和 Any
值调用 .put
函数。
let context = ...
context.put("somekey", "value")
Context
类会自动创建所需的任何子上下文来支持提供的键。如果提供的键复杂,它将创建任何中间上下文。
let context = ...
let key = Key.from("root", "mid", "leaf")
context.put(key, "value")
缓存中的每个项都与有效时间(set valid for time)一起存储。默认为1小时,但可以在调用过程中通过传递 validFor
参数来覆盖每个项。
let context = ...
context.put("somekey", "value", validFor: 60) // Valid for 1 minute
从上下文中获取项也同样简单。使用带有键的 .get
函数。结果是可选的,因为该项可能在该位置不存在。
let context = ...
let result = context.get("somekey")
get 函数还允许捕获类型。如果您使用类型捕获,当该键的值不是请求的类型时,它将返回 nil
。
let context = ...
let result : String? = context.get("somekey")
项还可以通过异步回调机制检索。
let context = ...
context.getAsync(key: "somekey", callback: { (result: String?) in
print(result)
})
在项未在缓存中找到时调用加载数据的函数
let context = ...
context.getAsync(key: "somekey", loader: { done in
done("value")
}, callback: { (result: String?) in
print(result)
})
再次,您得到这个...
let context = ...
context.remove("somekey")
要注意的一件事是,通过代表子上下文的键进行删除将删除该上下文及其树中的所有子项。这是一个有效率的树修剪机制。
let context = ...
context.put(Key.from("users", "1243"), userOne)
context.put(Key.from("users", "2345"), userTwo)
context.put(Key.from("users", "3456"), userThree)
context.remove(Key.from("users"))
还有可能从上下文中清除所有条目。清除将删除上下文中的所有内容。
let context = ...
context.clear()
MemoryContext
类是一个仅内存的基本上下文。这不会将任何内容存储到磁盘,也不会进行复杂的穿透加载。
let context = MemoryContext()
DiskContext
类是一个仅磁盘的基本上下文。这不会在内存中存储任何内容。
let context = DiskContext(dirUrl: localUrl)
Cache
类表示 Hoard 库的根 Context
。
创建 Cache
let cache = Cache()
使用共享实例
let cache = Cache.shared