AppSession是对字典类型的一个简单包装,允许您在单个App会话期间轻松地在不同的SpriteKit场景或ViewController之间共享数据。
AppSession可通过CocoaPods获得。要安装它,只需将以下行添加到您的Podfile中
use_frameworks!
target "Your_Project_Target_Here" do
pod 'AppSession', '0.1.1'
end
AppSession使用sharedInstance模式表示单例。
因此,无需声明任何AppSession对象。
使用 set 方法在AppSession中存储某些东西
let foobar = 42
AppSession.set("foo", value: foobar)
稍后,可以使用 get 从AppSession中取出某些东西
let barFoo = AppSession.get("foo") as? Int
使用 delete 删除AppSession中不再需要的某些东西
AppSession.delete("foo")
使用 AppSession.set 的 group 参数以减少键冲突,或将数据标记为相关
例如:假设我们在一个餐厅应用的菜单页面上
AppSession.set("main_dish", value: "Steak", group: "order")
AppSession.set("side_dish", value: "Salad", group: "order")
AppSession.set("coupon", value: "12231", group: "order")
现在当您切换到结账页面时,您可以从AppSession中拉取“订单”。AppSession包括一个 typealias AppSessionGroup
typealias AppSessionGroup = [String: Any]
使用 typealias 从AppSession中提取组。
let customerOrder = AppSession.get("order") as? AppSessionGroup
然后您可以访问值,因为这是一个具有Any的字典
let mainDishName = customerOrder?["main_dish"] as? String
let sideDishName = customerOrder?["side_dish"] as? String
let couponCode = customerOrder?["coupon"] as? String
因此,如果优惠券导致在结账页面之上显示一些需要更新订单的模态视图,我们只需更新AppSession中的“订单”组即可
AppSession.set("special_discount", value: 0.20, group: "order")
然后当您关闭模态窗口时,可以弹出折扣并将其应用于价格
let discount = AppSession.pop("special_discount") as? Double
现在不是挺方便的吗?我们不必发射任何NSNotifications或重新连接Storyboards,也不必将一个特殊的Discount属性添加到Model中,或者修改可能会由于代码中某个未更新的随机位置而破坏CI服务器构建的单元测试。
AppSession允许您存储复杂类型,如类、结构体和嵌套数组。
使用它们的技巧在于检索时正确类型转换值。
考虑你在代码中定义的结构,你把它放在 AppSession 中。
struct BasicStruct {
var property: String
init(property: String) {
self.property = property
}
}
let basicStruct = BasicStruct(property: "hello world")
AppSession.set("basic_struct", value: basicStruct)
就像任何其他类型一样,你可以在 AppSession 中通过转换值来获取结构。
let myStruct = AppSession.get("basic_struct") as? BasicStruct
类作为引用类型,在 AppSession 中不创建你类的单独副本,因此会有所不同。
如果你在会话之外更新对象的值,其变更将更新 AppSession 中的共享引用。
/* WARNING: Storing reference types within AppSession could lead to accidental state changes */
class BasicClass {
var prop: Int
init(prop: Int) {
self.prop = prop
}
func method() -> String {
return String(self.prop)
}
}
通过设置属性值来更新类。
let basicClass: BasicClass? = BasicClass(prop: 42)
// Store the class in the session
AppSession.set("basic_class", value: basicClass)
现在我们在会话外再次设置 prop。
basicClass?.prop = 777
一旦从会话中获取到类,它将具有更新的值。
let basicClassFromSession = AppSession.get("basic_class") as? BasicClass
assert(basicClass?.prop == basicClassFromSession?.prop)
务必谨慎在 AppSession 中存储引用类型。
其他方法包括以下内容
计数返回 AppSession 中的键数。
AppSession.count
键将返回所有键的 集合。
AppSession.keys
groups 将返回所有组名的 集合(字符串)。
AppSession.groups
完全清除整个 AppSession。
AppSession.clear()
如果给定的键在当前 AppSession 中存在,则返回 true。
AppSession.contains("some_key")
// This is equivalent to
AppSession.keys.contains("some_key".lowercaseString)
打印 AppSession 中当前存储的项目的 DEBUG 输出。
AppSession.info()
由于我对现有工具的不满——这些工具需要访问磁盘以进行缓存、要求修改我的代码以实现某些奇怪的协议,或者无法处理存储引用类型,因此创建了 AppSession。在创建/调试我的一款 SpriteKit 游戏期间,我开始构建一个类,它允许我基于任何任意游戏数据初始化一个 SKScene;我将代码从我的游戏中提取出来,并将其重命名为 AppSession。
AppSession 可在 MIT 许可下获得。有关更多信息,请参阅 LICENSE 文件。