Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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

Expand Down
16 changes: 16 additions & 0 deletions Sources/TaskQueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@

import Foundation

public struct TaskQueueStatus {
public var activeTaskCount: Int
public var maximumActiveTaskCount: Int
public var queuedTaskCount: Int
public var running: Bool
}

// MARK: TaskQueue class

open class TaskQueue: CustomStringConvertible {
Expand All @@ -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
Expand Down Expand Up @@ -125,6 +134,13 @@ 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)
)
})
}
}

Expand Down