Skip to content

Instantly share code, notes, and snippets.

@mwrites
Last active June 2, 2019 12:49
Show Gist options
  • Save mwrites/9ea7debb9c96995a4a04ce80616f3276 to your computer and use it in GitHub Desktop.
Save mwrites/9ea7debb9c96995a4a04ce80616f3276 to your computer and use it in GitHub Desktop.
JobQueue Implementation in Swift
//MARK: -
//MARK: Private
class JobQueueCenter {
fileprivate let storageAccessQueue = DispatchQueue(label: "com.JobQueueCenter.storageAccessQueue")
fileprivate lazy var storage: JobQueueStorage = { ... }
fileprivate func serializeStorage() {}
fileprivate init() {
NotificationCenter.default.addObserver(self, selector: #selector(tryPersist), name: .UIApplicationDidReceiveMemoryWarning, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(tryPersist), name: .UIApplicationWillResignActive, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(tryPersist), name: .UIApplicationDidEnterBackground, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(tryPersist), name: .UIApplicationWillTerminate, object: nil)
NotificationCenter.default.addObserver(forName: Notification.Name.JobFailedNotification, object: nil, queue: nil) { notification in
let job = notification.object as! Job
if job.retryableCount > 0 {
self.enqueue(job: job)
}
}
}
}
//MARK: -
//MARK: Public API
extension JobQueueCenter {
static let current = JobQueueCenter()
func enqueue(job: Job) {
storageAccessQueue.async {
self.storage.enqueue(job)
}
}
func executeNext() {
storageAccessQueue.async {
let job = self.storage.dequeue()
job?.run()
}
}
func persist() {
storageAccessQueue.async {
self.serializeStorage()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment