AppSession 0.2.0

AppSession 0.2.0

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

taywils维护。



  • taywils

AppSession

简介

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.setgroup 参数以减少键冲突,或将数据标记为相关

例如:假设我们在一个餐厅应用的菜单页面上

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?

由于我对现有工具的不满——这些工具需要访问磁盘以进行缓存、要求修改我的代码以实现某些奇怪的协议,或者无法处理存储引用类型,因此创建了 AppSession。在创建/调试我的一款 SpriteKit 游戏期间,我开始构建一个类,它允许我基于任何任意游戏数据初始化一个 SKScene;我将代码从我的游戏中提取出来,并将其重命名为 AppSession。

AppSession 不是什么?

  • Core Data 的替代品
  • Realm 的替代品
  • NSKeyedArchiver 的替代品
  • NSUserDefaults 的替代品
  • 缓存

AppSession 是什么?

  • 在 SKScene/ViewController 转场之间的简单数据存储位置
  • 辅助解耦 ViewControllers/SKScenes 的工具
  • 帮助您停止在应用中使用不必要的静态全局值的工具(嗯,讽刺……但是是的,现在您可以将它们还原为结构并在 AppSession 中保留它们)
  • 帮助减少仅更新数据而引发 NSNotifications 的方式

许可

AppSession 可在 MIT 许可下获得。有关更多信息,请参阅 LICENSE 文件。