Pantry 0.3

Pantry 0.3

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2016年9月
SPM支持 SPM

Nick O'Neill 维护。



Pantry 0.3

Storage

安装问题许可证

如果您想帮助我们达到 1.0 并了解更多关于 Pantry 的用例,请在 问题 中加入我们。

Pantry 是一种轻量级方式来持久化包含用户数据、缓存的内容简介或其他相关对象,以便以后检索。

let someCustomStruct = SomeCustomStruct(...)
Pantry.pack(someCustomStruct, "user_data")

... later ...

if let unpackedCustomStruct: SomeCustomStruct = Pantry.unpack("user_data") {
  print("got my data out",unpackedCustomStruct)
} else {
  print("there was no struct data to get")
}

您可以存储

  • [x] 结构体
  • [x] 字符串、整数和浮点数(我们的默认类型)
  • [x] 结构体和默认类型的数组
  • [x] 嵌套结构体
  • [ ] 嵌套数组
  • [x] 类
  • [x] 类和默认类型的数组
  • [x] 嵌套类
  • [x] 带原始类型的枚举

查看 测试 以详细了解您能够轻松存储的各种类型。

兼容性

Pantry 需要 iOS 8+ 并与 Swift 3 项目兼容。请使用发行版 0.2.2 来使用已支持的最终 Swift 2.x 版本,或者使用 swift2 分支。对于 Objective-C 的支持不太可能。

安装

对于 Carthage 的安装很简单

github "nickoneill/Pantry" ~> 0.3

至于 CocoaPods,使用此命令获取最新版本

use_frameworks!

pod 'Pantry'

并在您希望使用它的文件中使用 import Pantry

使用方法

基本类型

Pantry 提供一些基本类型(StringIntFloatBool)的序列化,无需设置。您可以使用它作为一个简单的过期缓存,如下所示

if let available: Bool = Pantry.unpack("promptAvailable") {
    completion(available: available)
} else {
    anExpensiveOperationToDetermineAvailability({ (available) -> () in
      Pantry.pack(available, key: "promptAvailable", expires: .Seconds(60 * 10))
      completion(available: available)
    })
}

自动持久化变量

使用 Swift 的 get/set 来自动在写入时持久化变量的值,并在读取时获取最新值。

var autopersist: String? {
    set {
        if let newValue = newValue {
            Pantry.pack(newValue, key: "autopersist")
        }
    }
    get {
        return Pantry.unpack("autopersist")
    }
}

...later...

autopersist = "Hello!"
// restart app, reboot phone, etc
print(autopersist) // Hello!

结构体

为要存储的任何结构体添加 Storable 协议,并确保通过实现一个从仓库获取每个属性的 init 方法以及一个将其他方法转换的 toDictionary 方法来遵守该协议

struct Basic: Storable {
    let name: String
    let age: Float
    let number: Int

    init(warehouse: Warehouseable) {
        self.name = warehouse.get("name") ?? "default"
        self.age = warehouse.get("age") ?? 20.5
        self.number = warehouse.get("number") ?? 10
    }

    func toDictionary() -> [String : AnyObject] {
        return [ "name": self.name, "age": self.age, "number": self.number ]
    }
}

获取器始终提供一个可选值,您可以选择在值不可用的情况下填写默认值。这使得在结构体中添加属性变得无烦恼。

类也受到支持,可以像处理结构体一样设置它们,但这里的构造函数必须标记为required。类继承和嵌套可存储属性也是可能的。

class ModelBase: Storable {
    let id: String

    required init(warehouse: Warehouseable) {
        self.id = warehouse.get("id") ?? "default_id"
    }

    func toDictionary() -> [String : AnyObject] {
        return [ "id": self.id ]
    }
}

class BasicClassModel: ModelBase {
    let name: String
    let age: Float
    let number: Int

    required init(warehouse: Warehouseable) {
        self.name = warehouse.get("name") ?? "default"
        self.age = warehouse.get("age") ?? 20.5
        self.number = warehouse.get("number") ?? 10

        super.init(warehouse: warehouse)
    }

    func toDictionary() -> [String : AnyObject] {
        var dictionary = super.toDictionary()
        dictionary["name"] = self.name
        dictionary["age"] = self.age
        dictionary["number"] = self.number
        return dictionary
    }
}

另外

Pantry可以很好地与网络数据配合使用,与JSON结构解码器(如Unbox)配合使用时表现出色。下载JSON,使用Unbox解码它,并用Pantry保存,根据需要保留。Pantry的架构深受Unbox的影响,无论如何都值得一看。

许可证

Pantry使用MIT许可证。如果您有任何问题或想分享您如何使用此工具,请提交问题。

ack

CDH from the Noun Project设计的Pantry“罐头图标”