UserDefaultsSnapshot

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

概述

从 UserDefaults 创建快照的模式

此对象只是一个模式,用于投影 UserDefaults 管理的键。
所以没有命名空间,请仔细命名键。

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

💎 如上所述,此对象只是一个模式,类似于访问 UserDefaults 的代理(技术上是 UserDefaults 字典的表示)
指定的键将直接用于读取和写入。
这意味着我们可以随时开始和停止使用这个库!
并且不需要投影 UserDefaults 上的所有键。
我们只投影我们想要放在快照上的键。
我们可以为每个用例创建多个模式。

属性

创建一个持久性存储

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 管理的值。
快照读取由 UserDefaults 创建的底层字典。

与写入相同,由于创建了一个模式,我们可以类型安全地读取该值。

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

XCTAssertEqual(snaphot.name, "John") // ✅

订阅每次 UserDefaults 更新的快照

UserDefaultsPersistentStore 在每次接收到指示 UserDefaults 更改的通知时,都会发布新的快照。
为此,它提供了 sinkSnapshot 方法。

let token = persistentStore.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 = persistentStore.sinkSnapshot { [weak store] snapshot in
  // ✅ Updates a snapshot every updates.
  store?.commit {
    $0.defaults = snapshot
  }  
}

使用 store

let store: MyStore<MyState, Never>

store.sinkState { state in 

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

安装

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

import UserDefaultsSnapshotLib

CocoaPods

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

pod 'UserDefaultsSnapshotLib'

SwiftPM

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

设置好 Swift 包后,添加 Alamofire 作为依赖项就像将其添加到 Package.swiftdependencies 值一样简单。

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

作者

🇯🇵 Muukii (Hiroshi Kimura)

许可证

UserDefaultsSnapshot 在 MIT 许可证下发布。