Once 允许你使用直观的 API 管理任务的执行次数。
Token
在内存中记录任务的执行次数,这允许任务在应用程序的整个生命周期中只执行一次。
你可以把它看作 OC 中 dispatch_once
的替代品
static dispatch_once_t token;
dispatch_once(&token, ^{
// do something only once
});
使用 Token
的 Swift 代码如下
let token = Token.makeStatic()
token.do {
// do something only once
}
或者,更简单:
Token.do {
// do something only once
}
你也可以不使用 static
class Manager {
let loadToken = Token.make()
func ensureLoad() {
loadToken.do {
// do something only once per manager.
}
}
}
与 run
不同,do
将持久化任务的执行历史(使用 UserDefault
)。
PersistentToken
根据 Scope
和 TimesPredicate
确定是否应执行此任务。
Scope
表示一个时间范围,它是一个枚举
.install
: 从应用程序安装开始.version
: 从应用程序更新开始.session
: 从应用程序启动开始.since(let since)
: 从 since(Date)
开始.until(let until)
: 到 until(Date)
结束TimesPredicate
表示一个次数范围。
let p0 = TimesPredicate.equalTo(1)
let p1 = TimesPredicate.lessThan(1)
let p2 = TimesPredicate.moreThan(1)
let p3 = TimesPredicate.lessThanOrEqualTo(1)
let p4 = TimesPredicate.moreThanOrEqualTo(1)
你可以使用 Scope
和 TimesPredicate
制定你想要的任何计划,而且,是的,它是线程安全的。
let token = PersistentToken.make("showTutorial")
token.do(in: .version, if: .equalTo(0)) {
app.showTutorial()
}
// or
let later = 2.days.later
token.do(in: .until(later), if: .lessThan(5)) {
app.showTutorial()
}
有时你的异步任务可能会失败。 你不想将失败的任务标记为已完成。 你可以
let token = PersistentToken.make("showAD")
token.do(in: .install, if: .equalTo(0)) { task in
networkService.fetchAD { result in
if result.isSuccess {
showAD(result)
task.done()
}
}
}
但此时,判断不再是绝对安全的 - 如果有多个线程同时检查令牌,但这应该很少发生,😉。
你也可以清除任务的执行历史
token.reset()
也可以清除所有任务的执行历史,但风险自负
PersistentToken.resetAll()
pod 'Once', '~> 1.0.0'
github "luoxiu/Once" ~> 1.0.0
dependencies: [
.package(url: "https://github.com/luoxiu/Once", .upToNextMinor(from: "1.0.0"))
]
遇到错误? 想要更多功能? 随时打开 issue 或直接提交 pr!