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")
}
您可以存储
查看 测试 以详细了解您能够轻松存储的各种类型。
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 提供一些基本类型(String
、Int
、Float
、Bool
)的序列化,无需设置。您可以使用它作为一个简单的过期缓存,如下所示
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许可证。如果您有任何问题或想分享您如何使用此工具,请提交问题。
由CDH from the Noun Project设计的Pantry“罐头图标”