Once(简体中文)

Build Status release install platform license

Once 允许你使用直观的 API 管理任务的执行次数。

亮点

用法

Token

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.
        }
    }
}

PersistentToken

run 不同,do 将持久化任务的执行历史(使用 UserDefault)。

PersistentToken 根据 ScopeTimesPredicate 确定是否应执行此任务。

Scope

Scope 表示一个时间范围,它是一个枚举

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

你可以使用 ScopeTimesPredicate 制定你想要的任何计划,而且,是的,它是线程安全的。

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"))
]

贡献

遇到错误? 想要更多功能? 随时打开 issue 或直接提交 pr!