PersistenceKit 1.4

PersistenceKit 1.4

Samcro 维护。



Build Status Test Coverage Platforms Cocoapods Carthage compatible Swift Package Manager compatible Swift Xcode MIT

tl;dr

你喜欢 Swift 的 Codable 协议并在所有地方使用它,谁不喜欢呢!这里有一个简单且非常轻盈的方式,用几行代码将 Codable 对象存储和检索到各种持久化层!

持久化层

PersistenceKit 提供了 3 层持久化,适合大多数用例

1. UserDefaults

  • 使用 UserDefaults 存储数据。
  • 适用于存储合理数量的对象。

2. 文件

  • 使用 FileManager 将数据直接存储到应用的文档目录中的文件夹。
  • 适用于存储大量对象。

3. 密钥链

  • 使用《Security框架》将数据存储到操作系统的密钥链中。
  • 适合存储敏感数据,如访问令牌。

什么是v1.3的新特性?

1.3版支持Swift 5.0。

安装

通过CocoaPods

要使用CocoaPods将PersistenceKit整合进您的Xcode项目,请在您的Podfile中指定它。

pod 'PersistenceKit'
Carthage

要使用Carthage将PersistenceKit整合进您的Xcode项目,请在您的Cartfile中指定它。

github "Teknasyon-Teknoloji/PersistenceKit"
Swift包管理器

您可以使用Swift包管理器通过在您的Package.swift文件中添加适当的描述来安装PersistenceKit

import PackageDescription

let package = Package(
  name: "YOUR_PROJECT_NAME",
  targets: [],
  dependencies: [
    .package(url: "https://github.com/Teknasyon-Teknoloji/PersistenceKit.git", from: "0.1")
  ]
)

请注意,Swift包管理器正处于初步设计和开发阶段,有关更多信息,请查看其GitHub页面

手动

源代码文件夹添加到您的Xcode项目中。

用法

假设您有两个结构体:以下定义的UserLaptop

struct User: Codable {
	var id: Int
	var firstName: String
	var lastName: String
	var laptop: Laptop?
}
struct Laptop: Codable {
	var model: String
	var name: String
}

1. 遵守Identifiable协议并设置idKey属性

Identifiable协议让PersistenceKit知道每个对象的唯一ID是什么。

struct User: Codable, Identifiable {
	static let idKey = \User.id
	...
}
struct Laptop: Codable, Identifiable {
	static let idKey = \Laptop.model
	...
}

留意到 User 使用 Int 作为它的 id,而 Laptop 使用 String,实际上 id 可以是任何类型。PersistenceKit 使用 Swift 的 keypath 来引用属性而不实际调用它们。Swift 真棒🤘

2 创建数据存储

// To save objects to UserDefaults, create UserDefaultsStore:
let usersStore = UserDefaultsStore<User>(uniqueIdentifier: "users")!
let laptopsStore = UserDefaultsStore<Laptop>(uniqueIdentifier: "laptops")!

// To save a single object to UserDefaults, create UserDefaultsStore:
let userStore = SingleUserDefaultsStore<User>(uniqueIdentifier: "user")!

// To save objects to the file system, create FilesStore:
let usersStore = FilesStore<User>(uniqueIdentifier: "users")
let laptopsStore = FilesStore<Laptop>(uniqueIdentifier: "laptops")

// To save a single object to the file system, create SingleFilesStore:
let userStore = SingleFilesStore<User>(uniqueIdentifier: "user")

// To save a single object to the system's keychain, create SingleKeychainStore:
let userStore = SingleKeychainStore<User>(uniqueIdentifier: "user")

3. 哇!一切准备就绪!

let macbook = Laptop(model: "A1278", name: "MacBook Pro")
let john = User(userId: 1, firstName: "John", lastName: "Appleseed", laptop: macbook)

// Save an object to a store
try! usersStore.save(john)

// Save an array of objects to a store
try! usersStore.save([jane, steve, jessica])

// Get an object from store
let user = store.object(withId: 1)
let laptop = store.object(withId: "A1278")

// Get all objects in a store
let laptops = laptopsStore.allObjects()

// Check if store has an object
print(usersStore.hasObject(withId: 10)) // false

// Iterate over all objects in a store
laptopsStore.forEach { laptop in
	print(laptop.name)
}

// Delete an object from a store
usersStore.delete(withId: 1)

// Delete all objects in a store
laptops.deleteAll()

// Know how many objects are stored in a store
let usersCount = usersStore.objectsCount

要求

  • iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 10.0+
  • Swift 4.2+

感谢

特别感谢:

  • Paul Hudson 的关于如何使用 Swift keypath 来编写更自然代码的 文章

版权

许可证

PersistenceKit 在 MIT 许可证下发布。更多信息请见 LICENSE