UserDefaultsSnapshotLib 1.2.0

UserDefaultsSnapshotLib 1.2.0

muukii 维护。



  • Muukii

UserDefaultsSnapshot

这个库允许我们创建 UserDefaults 管理的值的快照。
快照意味着一个不可变的数据模型,可以非常有效地嵌入到状态管理中。

swift5.3 Tests cocoapods

概述

从 UserDefaults 创建快照的模式

此对象仅是一个模式,它反映了 UserDefaults 管理的键。
因此没有任何命名空间,请在命名键时仔细。

final class MyDefaults: UserDefaultsObject {
  @Property(key: "count") var count = 0
  @OptionalProperty(key: "name") var name: String?
}

💎正如上面提到的,此对象仅是一个模式,就像访问 UserDefaults 的代理(技术上表示为 UserDefaults 字典)
指定的键将用于直接读/写。
这意味着我们可以随时开始或停止使用此库!
无需将UserDefaults上的所有键都展现在上面。
我们只需将我们想要的键放入快照中。
我们还可以为每个用例创建多个模式。

属性

  • 属性 - 一个非可选的值属性,如果 UserDefaults 返回 nil,则返回初始化值。
  • OptionalProperty - 一个可选值属性

创建持久存储

let userDefaults = UserDefaults.init("your_userdefaults")!
let persistentStore = UserDefaultsPersistentStore<MyDefaults>(userDefaults: userDefaults)

UserDefaultsPersistentStore 上写入值

通过创建模式,我们可以安全地使用类型修改值。

persistentStore.write { d in
  d.name = "John"
}

XCTAssertEqual(userDefaults.string(forKey: "name"), "john") //

从持久存储读取值

使用快照从 UserDefaults 管理的值中读取。
snapshot 读取由 UserDefaults 创建的表示底层字典的快照。

与写入类似,由于创建了模式,我们可以安全地读取值。

let snaphot: UserDefaultsSnapshot<MyDefaults> = persistentStore.makeSnapshot()

XCTAssertEqual(store.makeSnapshot().name, "John") //

订阅每个 UserDefaults 更新时的快照

UserDefaultsPersistentStore 每接收到表示 UserDefaults 发生变化的通知,就发布新的快照。
因此,它提供了 sinkSnapshot 方法。

let token = store.sinkSnapshot { snapshot in
  // Receives initial snapshot and every time UserDefaults updated.
}

与 Verge 的集成

Verge 是一个状态管理库。

快照是一个引用类型,但它是不可变的数据模型。
它可以嵌入到值类型中,例如状态管理中的存储。

struct MyState {

  // ✅ Embed a snapshot here.
  var defaults: UserDefaultsSnapshot<MyDefaults>
  
  // 💡 We can add any computed property to munipulate the value and provides.
  var localizedName: String {
    defaults.name + "+something"
  }
}

let persistentStore: UserDefaultsPersistentStore<MyDefaults>

let store: MyStore<MyState, Never> = .init(initialState: .init(defaults: persistentStore.makeSnapshot())

let token = store.sinkSnapshot { [weak store] snapshot in
  // ✅ Updates a snapshot every updates.
  store?.commit {
    $0.defaults = snapshot
  }  
}

使用存储

let store: MyStore<MyState, Never>

store.sinkState { state in 

  state.ifChanged(\.localizedName) { value in 
    print(value) // "John+something"
  }
  
}

安装

使用以下安装方法导入模块。

import UserDefaultsSnapshotLib

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要将 Alamofire 集成到您的 Xcode 项目中,请使用 CocoaPods 并在您的 Podfile 中指定它。

pod 'UserDefaultsSnapshotLib'

SwiftPM

Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并集成到 swift 编译器中。它仍处于早期开发阶段,但 Alamofire 支持其在支持平台上的使用。

一旦您设置了 Swift 包,将 Alamofire 添加为依赖项就与将其添加到 Package.swift 中的 dependencies 值一样简单。

dependencies: [
  .package(url: "https://github.com/VergeGroup/UserDefaultsSnapshot.git", .upToNextMajor(from: "1.0.0"))
]

作者

🇯🇵Muukii(Hiroshi Kimura)

许可

UserDefaultsSnapshot 在 MIT 许可下发布。