欢迎!这个项目有望帮助你在 Swift 中运行计划任务和重复函数!这是用纯 Swift 构建健壮的 cron 应用的非常基础的开始。 还有很多工作要做。 欢迎并鼓励提交 Pull Request... 😃
要将 Cron 添加到你的项目中,你首先需要在 Package.swift 中将此仓库添加为依赖项
.Package(url: "https://github.com/rymcol/SwiftCron.git", majorVersion: 0)
其次,你需要在 Sources 和 Package.swift 中添加一个新的可执行目标。 你最终应该得到一个至少像这样的目录结构
Example-Project
├── Sources
│ ├── main.swift
└── Package.swift
以及一个看起来类似于这样的 Package.swift
let package = Package(
name: "Swift-Cron-Test",
targets: [],
dependencies: [
.Package(url: "https://github.com/rymcol/SwiftCron.git", majorVersion: 0)
]
)
你必须将你的 cron 放在它自己的可执行目标中(它会阻塞,因此在 cron.start() 之后没有任何东西会运行,并且如果你把它放在之后,比如说启动一个服务器端 Swift 服务器,那将阻止 cron 启动)
至少需要
import Foundation
import SwiftCron
// Welcome to Cron!
// If you add frequency: X to the intializer here, cron will attempt to run your jobs every X seconds
// If you do not add a frequency, it defaults to 60 (every minute)
let cron = Cron()
//Define Functions to Run Here, Elsewhere in your project, or import your own frameworks
//Make jobs
let job = CronJob(funcNameHere)
//Add jobs to queue
cron.add(job)
//Start Cron So the Jobs Run
cron.start()
所有内容都应按照示例中的顺序排列。 你也可以从另一个框架导入函数,或者在项目的新文件中编写自己的函数。 Cron 将接受任何没有返回且没有参数的有效函数。
这个例子中发生了很多事情,所以我将分解它们,并且 Cron 有更多内置功能,这些功能默认情况下处理。
首先,我们创建一个对运行循环的引用,以及 var shouldKeepRunning
。 要随时终止应用程序,你可以将其设置为 false。
接下来,我们用 let cron = Cron()
初始化 SwiftCron。 这个初始化器实际上接受两个参数,但为它们设置了默认值。 实际的初始化器声明为 public init(frequency: TimeInterval = 60, cronStorage: CronStore = MemoryCronStore())
。 frequency:
接受一个 double 类型的值,用于定义 cron 检查作业并运行它们的频率(以秒为单位)。 默认值为每分钟,但你可以更改此值以满足你的需求。 CronStore:
接受任何符合 CronStore
协议的类,并负责存储 cron 作业。 默认实现是内存存储,如果未传递此值,将为你创建它。
如果你想要更持久的存储,一些正在开发中。 如果你不想等待,你可以创建自己的。 你需要遵循的协议是
//存储协议 public protocol CronStore { var jobs: [CronJob] { get }
func add(_ job: CronJob)
func remove(_ job: CronJob)
}
即,你的类需要为 Cron 提供一种添加新作业、删除旧作业的方法,并且你必须通过数组的方式为其提供访问存储中作业的方法。 确保在你的类初始化器期间从数据库或其他持久存储加载作业,以确保它们为下一部分做好准备。
初始化 cron 后,你需要创建作业。 模型已为你提供,重要的部分是其初始化器:public init(_ method: @escaping () -> (), executeAfter date: Date = Date(), allowsSimultaneous: Bool = false, repeats: Bool = false, repeatEvery interval: TimeInterval? = nil)
。 这里(再次)有很多默认值,使事情变得简单但健壮。
创建作业的最简单方法是 let job = CronJob(funcNameHere)
,其中 funcNameHere
是你要运行的方法。 同样,这必须不带参数且没有返回 (-> Void)。 这会创建一个立即运行的单次作业。 如果这正是你所需要的,那就太好了,但你们大多数人可能在这里是为了更多。
executeAfter:
参数接受一个 Date。 默认值是现在。 当传递未来日期时,这将阻止作业运行,直到该日期过去并且 Cron 类检查要运行的作业(参见上面 Cron 初始化中的 interval:
)。
allowsSimultaneous:
参数是一个布尔值,默认为 false。 如果此值为 false,这将阻止重复作业在相同的作业已在运行时运行。 如果你想确保方法在当前正在运行时不启动,无论它是否设置为重复,这都很有用。 如果你将此值设置为 true,即使相同的作业已经在运行,它也允许 cron 重新启动该作业。
repeats:
参数也是一个布尔值。 当设置为 true 时,此值将导致作业重复。 请注意,如果与 allowsSimultaneous
一起设置,你可能会同时运行很多相同的东西,因为它会立即重复。
repeatEvery:
参数接受一个 TimeInterval(double),并将 repeats 设置为 true。 如果你传递此参数,则 repeats:
将始终为 true,即使你将其作为 false 传递或根本不包含它。 将秒数传递给此参数将使其在该秒数后重复。 例如,如果你传递 repeatEvery: 86400
,你的作业将在启动时运行,然后在下一个 cron 间隔检查作业后 24 小时运行。 更多强大的功能有望在以后推出。
定义作业后,cron.add(job)
会将该作业添加到 cron。 你也可以随时调用此方法,即使在 cron 启动后,以便添加新作业。
cron.start()
将启动 Cron 机器运行,从而运行任何已添加的作业,假设它们已超过其 executeAfter:
Date。
希望未来会有更多内容。 目前,请尽情享用。