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!