蜡翼
iOS 版本迁移在 Swift 中。在更改数据或执行任何其他类型的更新时,您需要确保运行所有相关迁移的顺序,并且只运行一次。Waxwing 允许您做到这一点。
要求
- Swift 5
- iOS 8+
安装
CocoaPods
Waxwing 通过 CocoaPods 提供。要安装,请将以下行添加到您的 Podfile 中。
pod "Waxwing"
Carthage
如果您不喜欢 CocoaPods,您可以通过 Carthage 添加依赖项,或者将 Waxwing.swift
添加到您的项目中。
Swift 包管理器
您可以使用 Swift 包管理器,通过添加它到您的 Package.swift
文件来安装 Waxwing
。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/JanGorman/Waxwing", majorVersion: 5),
]
)
使用
运行您的迁移有两种方法,即通过闭包或通过 OperationQueue
。
import Waxwing
…
let waxwing = Waxwing(bundle: .main, defaults: .standard)
waxwing.migrateToVersion("0.9") {
firstMigrationCall()
secondMigrationCall()
…
}
或者
import Waxwing
…
let waxwing = Waxwing()
Waxwing.migrateToVersion("0.9", [FirstMigrationClass(), SecondMigrationClass()])
请注意,基于闭包的迁移是从创建它们的线程上运行的。需要在主线程上运行的所有内容,例如通知用户此版本引入的变化,需要明确地在主线程上调用该方法。
import Waxwing
DispatchQueue.global().async {
let waxwing = Waxwing(bundle: .main, defaults: .standard)
waxwing.migrateToVersion("0.9") {
DispatchQueue.main.async {
// Some alert that we're done updating / what's new in this version of the app
}
}
}
基于 OperationQueue
的迁移始终在其自己的队列上运行,因此相同的警告也适用。另外请注意,如果队列中的任何迁移依赖于另一个已运行的迁移,您需要明确地添加此依赖项。Operation
通过 addDependency()
方法使这变得非常简单。
您可以添加任何数量的迁移。它们将只会运行一次。
进度
Waxwing 内置了对 Progress 的支持。由于使用闭包方法运行的操作数量无法确定,因此它只报告总计数为 1。如果您使用操作,单元计数将匹配迁移的数量。
import Waxwing
func migrate() {
let progress = Progress(totalUnitCount: 1)
progress.becomeCurrent(withPendingUnitCount: 1)
_ = progress.observe(\.fractionCompleted, options: [.new]) { progress, _ in
// e.g. Update progress indicator, remember to do this on the main thread
}
waxwing.migrateToVersion("0.8", migrations: [migration1, migration2, migration3…])
}
关于 Progress
如何工作,我推荐阅读 Ole Begemann 的这篇文章:这篇}。
作者
Jan Gorman
许可证
Waxwing 可在 MIT 许可证下使用。更多信息请参阅 LICENSE 文件。