PersistentObject 0.4.0

PersistentObject 0.4.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2017年12月
SwiftSwift 版本4.0
SPM支持 SPM

Matt Comi 维护。



  • 作者
  • Matt Comi

PersistentObject


Carthage compatible

Platform

Swift 的简单对象持久化。

包括对 NSUserDefaultsNSUbiquitousKeyValueStore 和文件系统的支持。

API 文档

入门

要持久化一个对象,请用希望存储的存储库初始化一个 PersistentObject。例如,将一个 Vehicle 持久化到一个文件中

let persistentVehicle = PersistentObject<Vehicle>(filename: "file.txt")

或者,将一个 Person 持久化到 NSUserDefaults 数据库中

let persistentPerson = PersistentObject<Person>(userDefaultsKey: personKey)

如果在存储库中已存在一个 PersistentObject,即如果它之前已经被持久化,它将被解档并初始化。要访问底层对象

if let person = persistentPerson.object {
  print("Hi, my name is \(person.name)")
}

初始化

如果存储库中尚不存在 PersistentObject,您需要自己初始化它

if persistentPerson.object == nil {
    persistentPerson.reset(Person(name: "Brian Doyle-Murray"))
}

保存和同步

当应用程序进入后台以及当 PersistentObject 被解构时,底层对象会自动归档到其存储库中。您也可以手动触发它

persistentPerson.save()

您还可以同步存储库

persistentPerson.synchronize()

通常情况下,手动同步仅在以下情况下是必要的

  1. 底层存储库是一个 UbiquituousKeyValueStoreRepository
  2. 在更改对象后需要尽可能快地上传到 iCloud

存储库

当前支持以下存储库

  • FileRepository:持久化到文件
  • UbiquituousKeyValueStoreRepository:持久化到 UbiquituousKeyValueStore
  • UserDefaultsRepository:持久化到 UserDefaults 数据库

这些存储库要求被持久化的对象必须是 NSCoding 兼容的。

外部更改

存储库可能支持外部更改。例如,当使用 UbiquituousKeyValueStoreRepository 时,值在 iCloud 中变化的可能。如果发生外部更改,PersistentObject 的底层对象将被替换,使得任何引用都无效。要在此情况发生时得到通知,请初始化 PersistentObject 时提供代理

let delegate = PersistentObjectDelegate<Person>()

delegate.objectChangedExternally = { (persistentObject) in
  // handle the external change
}

let p = PersistentObject<Person>(
  ubiquituousKeyValueStoreKey: "personKey",
  delegate: delegate)

自定义存储库

要提供一个自定义存储库,您可能需要实现 Repository 协议

public protocol Repository {
  associatedtype ObjectType
  var delegate: RepositoryDelegate<ObjectType> { get }
  func archive(_ object: ObjectType?)
  func unarchive() -> ObjectType
  func synchronize()
}

然后,为了用那个 Repository 初始化一个 PersistentObject

let p = PersistentObject<Person>(repository: MyCustomRepository())