一旦 1.0.0

Once 1.0.0

jianstm维护。



Once 1.0.0

  • 作者
  • Quentin Jin

Once(简体中文)

Build Status release install platform license

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根据ScopeTimesPredicate确定是否执行此任务。

范围

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

  • .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!