BFAutoCache 0.1.3

BFAutoCache 0.1.3

Wizardguy 维护。



  • 作者
  • Dennis

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包装器。