Skip to content

Instantly share code, notes, and snippets.

@AtsushiSuzuki
Last active August 25, 2017 03:44
Show Gist options
  • Save AtsushiSuzuki/b573e236f1daa666941970254f76cd3f to your computer and use it in GitHub Desktop.
Save AtsushiSuzuki/b573e236f1daa666941970254f76cd3f to your computer and use it in GitHub Desktop.
import Foundation
import PromiseKit
/// serialize async task execution
class TaskQueue {
private let queue = DispatchQueue(label: "jp.digital-sensation.TaskQueue")
private var tasks: [() -> Promise<Void>] = []
private var running = false
func schedule<Result>(task: @escaping () -> Promise<Result>) -> Promise<Result> {
let (promise, joint) = Promise<Result>.joint()
queue.async {
self.tasks.append {
let promise = task()
promise.join(joint)
return promise.asVoid()
}
self.next()
}
return promise
}
private func next() {
// must be called on self.queue
if running || tasks.count <= 0 {
return
}
let task = tasks.removeFirst()
running = true
task().always(on: self.queue) {
self.running = false
self.next()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment