Hoard 0.1.0

Hoard 0.1.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年6月
SwiftSwift 版本3.0
SPM支持 SPM

John Bailey 维护。



Hoard 0.1.0

  • JohnnyDevMode 和 tangplin

Hoard

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 为 StringNSURL 提供了 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

MemoryContext 类是一个仅内存的基本上下文。这不会将任何内容存储到磁盘,也不会进行复杂的穿透加载。

创建

let context = MemoryContext()

DiskContext

DiskContext 类是一个仅磁盘的基本上下文。这不会在内存中存储任何内容。

创建

let context = DiskContext(dirUrl: localUrl)

Cache

Cache 类表示 Hoard 库的根 Context

创建 Cache

let cache = Cache()

使用共享实例

let cache = Cache.shared