GroupWork is an easy to use Swift framework that helps you orchestrate your concurrent, asynchronous functions in a clean and organized way. This helps make large functions with multiple asynchronous tasks more clear and easy to follow.
For CocoaPods, add to Podfile
:
pod 'GroupWork', '~> 0.0'
For Carthage, add to Cartfile
:
github "quanvo87/GroupWork"
For SPM, add to your package dependencies:
.package(url: "https://github.com/quanvo87/GroupWork.git", .upToNextMinor(from: "0.0.0"))
- for projects, drag
GroupWork.swift
to the project tree - for workspaces, include the whole
GroupWork.xcodeproj
import GroupWork
...
func complexFunc(completion: @escaping (Bool) -> Void) {
let work = GroupWork()
work.asyncFuncA()
work.asyncFuncB()
work.asyncFuncC()
work.allDone() {
completion(work.result)
}
}
...
complexFunc
is a function that returns the result of three asynchronous functions asyncFuncA()
, asyncFuncB()
, and asyncFuncC()
, running concurrently. The completion handler is called only when all these functions have completed. Usage of this library has enabled the above clean interface. This can be scaled to much higher than three asynchronous functions.
notes:
- the asynchronous functions should be able to run concurrently without affecting each other
work.result
is only a simpleBool
- this is not an answer to callback hell
There is some set up required in order to create complexFunc()
from above:
import GroupWork
extension GroupWork {
func asyncFuncA() {
start()
networkCallA() { (result)
self.finish(withResult: result)
}
}
func asyncFuncB() {
start()
networkCallB() { (result)
self.finish(withResult: result)
}
}
func asyncFuncC() {
start()
networkCallC() { (result)
self.finish(withResult: result)
}
}
}
Now you can create a GroupWork
, and call work.simpleFuncA()
on it like in the example.
notes:
start()
must be called before an asynchronous taskfinish()
must be called in the completion handler of an asynchronous taskstart()
andfinish()
calls must be balanced
The tests have a working example.
- Quan Vo
- Wilson Ding
- Banner: Michelle Law
Please provide attribution, it is greatly appreciated.