BFAutoCache
一个用于自动将值存储到特定后端(默认为 UserDefaults)的 boxer 值类型
动机
每次您需要保存或访问存储在 UserDefaults 中的值时,您可能会遇到以下代码片段
var isOn: Bool {
set {
UserDefaults.standard.set(newValue, forKey: "kIsOn")
}
get {
return UserDefaults.standard.bool(forKey: "kIsOn")
}
}
var userID: Int {
set {
UserDefaults.standard.set(newValue, forKey: "kUserID")
}
get {
return UserDefaults.standard.integer(forKey: "kUserID")
}
}
...
如果有许多不同的值要处理,事情会变得非常无聊和令人厌烦。对于每个需要从/写入 UserDefaults 的值,您都不得不 repetition 写相同的代码。虽然您可以使用一个通用的方法来简化 setValue/getValue,但您仍然必须关注“Key”名称以使读写一致。
BFAutoCache 使得这项无聊的任务变得更加简单,甚至有一点点有趣!
使用 BFAutoCache
要缓存一个值,需要一个密钥来保存和检索该值。因此,当定义一个 AutoCache 值时,一个 名称 总是必须的,以绑定该值。通过访问 value 属性检索 AutoValue 实例的值。
示例
// This is equal to (by default Cachable implementation):
// UserDefaults.standard.set(1, forKey: "a")
// UserDefaults.standard.synchronize()
// print(UserDefaults.standard.int(forKey: "a"))
var i = AutoCache<Int>(name: "a")
i.value = 1
print(i.value)
Or you can use a initial value as the default value if there is no such key in Defaults
// This is equal to (by default Cachable implementation):
// UserDefaults.standard.regist(defaults: ["a": 1])
var i = AutoCache<Int>(name: "a", initial: 1)
var s = AutoCache<String>(name: "s")
s.value = "Snow"
print(s.value)
// This is equal to (by default Cachable implementation):
// UserDefaults.stand.set("Snow", forKey: "a")
// UserDefaults.synchronize()
// print(UserDefaults.standard.string(forKey: "a"))
还有三个运算符可以帮助更轻松、更简单地操纵 AutoCache 值。
- 要将密钥名称与默认值(如果密钥不存在,将返回默认值)相关联,请使用 '~~'。
var i = 1~~'i'
var s = "Ned"~~"LordOfNorth"
- 要分配一个值,请使用 '<~'。
i <~ 2
s <~ "Snow"
- 要访问值,请使用 '%%'。
print(%%i) // 2
print(%%s) // Snow
- 要清除缓存中的值,请将 nil 值分配给 AutoCache 变量。
i <~ nil
s <~ nil
当在结构或类中声明多个配置属性时,AutoCache 值特别有用。您可以选择哪些属性需要从后端缓存中保存/访问。
例如
struct Settings {
var delay: AutoCache<Int> // need cache
var title: AutoCache<String> // need cache
var brightness: Float // not cache
}
var settings = Settings(delay: 11~~"Delay", name: "hello"~~"Title", brightness: 1.0)
BFAutoCache 还支持与 UserDefaults 兼容的 基本数据类型
的 Array & Dictionary。
var cards: AutoCache<[Int]>
cards <~ [A, 2, J, K]
var books: AutoCache<[String: Float]>
books <~ ["Swift": 10.0, "Java": 8.0]
如何安装
简单使用Cocoapod
pod 'BFAutoCache'
增强BFAutoCache
实际上,任何符合 Cachable
协议的类型都可以利用AutoCache包装值的优势。您可以编写自己的可缓存类型扩展,将其传递给AutoCache,例如,sqlite包装器或CoreData包装器,甚至是plist包装器。