From 6029dd30607b98b2c01466dee7f6e530bc949cad Mon Sep 17 00:00:00 2001 From: Zane Shannon Date: Wed, 1 Aug 2018 12:55:32 -0700 Subject: [PATCH 1/4] added TaskQueueStatus struct. added collection of callbacks. added execution of callbacks following each task execution. --- Sources/TaskQueue.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Sources/TaskQueue.swift b/Sources/TaskQueue.swift index 93d969c..34e606d 100644 --- a/Sources/TaskQueue.swift +++ b/Sources/TaskQueue.swift @@ -14,6 +14,13 @@ import Foundation +public struct TaskQueueStatus { + var activeTaskCount: Int + var maximumActiveTaskCount: Int + var queuedTaskCount: Int + var running: Bool +} + // MARK: TaskQueue class open class TaskQueue: CustomStringConvertible { @@ -23,12 +30,14 @@ open class TaskQueue: CustomStringConvertible { // public typealias ClosureNoResultNext = () -> Void public typealias ClosureWithResultNext = (Any? , @escaping (Any?) -> Void) -> Void + public typealias ClosureWithTaskQueueStatus = (TaskQueueStatus) -> Void // // tasks and completions storage // open var tasks = [ClosureWithResultNext]() open lazy var completions = [ClosureNoResultNext]() + open var callbacks = [ClosureWithTaskQueueStatus]() // // concurrency @@ -126,6 +135,13 @@ open class TaskQueue: CustomStringConvertible { self.numberOfActiveTasks -= 1 self._runNextTask(nextResult) } + self.callbacks.forEach({ (callback) in + callback(TaskQueueStatus(activeTaskCount: self.numberOfActiveTasks, + maximumActiveTaskCount: self.maximumNumberOfActiveTasks, + queuedTaskCount: self.tasks.count, + running: self.running) + ) + }) } if maximumNumberOfActiveTasks > 1 { From 85ebdfab987299779a14651e509247b86e3711b6 Mon Sep 17 00:00:00 2001 From: Zane Shannon Date: Wed, 1 Aug 2018 13:04:33 -0700 Subject: [PATCH 2/4] document callbacks with an example. --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 62e6e76..c9309db 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ * [Serial and Concurrent Tasks](#serial-and-concurrent-tasks) * [GCD Queue Control](#gcd-queue-control) * [Extensive Example](#extensive-example) +* [Callbacks](#callbacks) +* [Callbacks Example](#callbacks-example) * [Credit](#credit) * [License](#license) @@ -293,6 +295,48 @@ queue.run { result in Run the included demo app to see some of these examples above in action. +## Callbacks + +You can register closures to receive status updates on the queue after each task executes. + +```swift +typealias ClosureWithTaskQueueStatus = (TaskQueueStatus) -> Void +``` + +They will receive a status object: + +```swift +struct TaskQueueStatus { + var activeTaskCount: Int + var maximumActiveTaskCount: Int + var queuedTaskCount: Int + var running: Bool +} +``` + +## Callbacks example + +```swift +let queue = TaskQueue() + +// +// Simple sync task, just prints to console +// +queue.tasks += { + print("====== tasks ======") + print("task #1: run") +} + +// +// Simple callback, just prints to console +// +queue.callbacks.append({ (status) in + print("task queue status", status) +}) + + +queue.run() +``` ## Credit From 1230e86d590f740d869ef1ad23228c45ec7294ca Mon Sep 17 00:00:00 2001 From: Zane Shannon Date: Thu, 2 Aug 2018 12:16:00 -0700 Subject: [PATCH 3/4] derp, need to publicize these properties. --- Sources/TaskQueue.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/TaskQueue.swift b/Sources/TaskQueue.swift index 34e606d..da48eb5 100644 --- a/Sources/TaskQueue.swift +++ b/Sources/TaskQueue.swift @@ -15,10 +15,10 @@ import Foundation public struct TaskQueueStatus { - var activeTaskCount: Int - var maximumActiveTaskCount: Int - var queuedTaskCount: Int - var running: Bool + public var activeTaskCount: Int + public var maximumActiveTaskCount: Int + public var queuedTaskCount: Int + public var running: Bool } // MARK: TaskQueue class From 39b5407953ed042637a8791c6cd9223369342c4c Mon Sep 17 00:00:00 2001 From: Zane Shannon Date: Thu, 2 Aug 2018 13:25:11 -0700 Subject: [PATCH 4/4] relocate callbacks. --- Sources/TaskQueue.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/TaskQueue.swift b/Sources/TaskQueue.swift index da48eb5..f90bdcc 100644 --- a/Sources/TaskQueue.swift +++ b/Sources/TaskQueue.swift @@ -134,14 +134,14 @@ open class TaskQueue: CustomStringConvertible { task!(self.maximumNumberOfActiveTasks > 1 ? nil : result) { nextResult in self.numberOfActiveTasks -= 1 self._runNextTask(nextResult) + self.callbacks.forEach({ (callback) in + callback(TaskQueueStatus(activeTaskCount: self.numberOfActiveTasks, + maximumActiveTaskCount: self.maximumNumberOfActiveTasks, + queuedTaskCount: self.tasks.count, + running: self.running) + ) + }) } - self.callbacks.forEach({ (callback) in - callback(TaskQueueStatus(activeTaskCount: self.numberOfActiveTasks, - maximumActiveTaskCount: self.maximumNumberOfActiveTasks, - queuedTaskCount: self.tasks.count, - running: self.running) - ) - }) } if maximumNumberOfActiveTasks > 1 {