A minimalistic job system in Swift, for Swift
Update your Package.swift
file.
.Package(url: "https://github.com/BrettRToomey/Jobs.git", majorVersion: 1)
Creating a new Job
is as simple as:
Jobs.add(interval: .seconds(4)) {
print("👋 I'm printed every 4 seconds!")
}
The Duration
enumeration currently supports .seconds
, hours
, .days
and .weeks
.
Jobs.add(interval: .days(5)) {
print("See you every 5 days.")
}
It's possible to create a Duration
from an Int
and a Double
.
10.seconds // `Duration.seconds(10)`
4.hours // `Duration.hours(4)`
2.days // `Duration.days(2)`
3.weeks // `Duration.weeks(3)`
By default, Job
s are started automatically, but if you wish to start one yourself, even at a later point in time, just do the following:
let job = Jobs.add(interval: 2.seconds, autoStart: false) {
print("I wasn't started right away.")
}
//...
job.start()
Giving up has never been so easy!
job.stop()
If you just want to asynchronously run a job, but not repeat it you can use the oneoff
functions.
Jobs.oneoff {
print("Sadly, I'm not a phoenix.")
}
How about waiting a little?
Jobs.oneoff(delay: 10.seconds) {
print("I was delayed by 10 seconds.")
}
Sometimes jobs can fail, that's okay, we have you covered.
Jobs.add(
interval: 10.seconds,
action: {
throw Error.someError
},
onError: { error in
print("caught an error: \(error)")
return RecoverStrategy.default
}
)
By default, jobs will be attempted again after a five second delay. If you wish to override this behavior you must first implement an onError
handler and return one of the following RecoveryStrategy
cases.
.none //do not retry
.default //retry after 5 seconds
.retry(after: Duration) //retry after specified duration
Here's a small sample:
enum Error: Swift.Error {
case recoverable
case abort
}
Jobs.add(
interval: 1.days,
action: {
//...
},
onError: { error in
switch error {
//we cannot recover from this
case .abort:
//do not retry
return .none
//we can recover from this
case .recoverable:
//... recovery code
//try again in 15 seconds
return .retry(after: 15.seconds)
}
}
)