简体中文)
Once(
Once允许您使用直观的API管理任务的执行次数。
高亮
- 安全
- 高效
- 持久性
用法
令牌
令牌
记录任务在内存中执行次数,允许任务在整个应用程序生命周期内只执行一次。
您可以将它视为OC中的dispatch_once
的另一种选择
static dispatch_once_t token;
dispatch_once(&token, ^{
// do something only once
});
以下是在Swift中使用Token
的代码示例
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
确定是否执行此任务。
范围
范围
表示一个时间范围,它是一个枚举类型
.install
:从应用程序安装开始.version
:从应用程序更新开始.session
:从应用程序启动开始.since(let since)
:从since(Date)
开始.until(let until)
:到until(Date)
TimesPredicate
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)
do
您可以使用 范围
和 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()
}
done
有时您的异步任务可能会失败。您不希望将失败的任务标记为完成。您可以
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()
}
}
}
但在此时刻,判断不再绝对安全 - 如果有多个线程同时检查令牌,但这很少发生,
reset
您还可以清除任务的执行历史记录
token.reset()
也可以清除所有任务的执行历史记录,但这需要您自己承担风险
PersistentToken.resetAll()
安装
CocoaPods
pod 'Once', '~> 1.0.0'
Carthage
github "luoxiu/Once" ~> 1.0.0
Swift Package Manager
dependencies: [
.package(url: "https://github.com/luoxiu/Once", .upToNextMinor(from: "1.0.0"))
]
贡献
遇到bug?想要更多功能?请随时提出问题或直接提交pr!