FabrizioBrancati / Queuer
- воскресенье, 6 августа 2017 г. в 03:13:53
Queuer is a queue manager, built on top of OperationQueue and Dispatch (aka GCD).
Swift 4 • Features • Requirements • Installing • Usage • Documentation • Changelog • Communication • Contributing • Author • License
If you need Swift 4 support, please switch to swift-4 branch.
Queuer is a queue manager, built on top of OperationQueue and Dispatch (aka GCD).
It allows you to create any synchronous and asynchronous task easily, with just a few lines.
Here is the list of all the features:
*)****
*Currently,URLSession.sharedproperty is not yet implemented on Linux.
| Swift | Xcode | Queuer | iOS | macOS | tvOS | watchOS | Linux | 
|---|---|---|---|---|---|---|---|
| 3.1 | 8.3 | 1.0.0 | 8.0+ | 10.10 | 9.0 | 2.0+ |   * | 
| 4.0 | 9.0 | ?.?.0 | 8.0+ | 10.10 | 9.0 | 2.0+ |   * | 
*Currently,URLSession.sharedproperty is not yet implemented on Linux.
See Requirements section to check Swift, Xcode, Queuer and OS versions.
import QueuerCreate a Podfile in your project directory and write into:
platform :ios, '8.0'
xcodeproj 'Project.xcodeproj'
use_frameworks!
pod 'Queuer'Change "Project" with your real project name
Open Terminal, go to your project directory and type: pod install
Import the framework with import Queuer
Enjoy!
Create a Cartfile in your project directory and write into:
github "FabrizioBrancati/Queuer"Open Terminal, go to project directory and type: carthage update
Include the created Framework in your project
Add Build Phase with the following contents:
/usr/local/bin/carthage copy-frameworksand add the paths to the Queuer framework under Input Files
$(SRCROOT)/Carthage/Build/iOS/Queuer.frameworkThis script works around an App Store submission bug triggered by universal binaries and ensures that necessary bitcode-related files are copied when archiving
Import the framework with import Queuer
Enjoy!
Create a Package.swift file in your project directory and write into:
import PackageDescription
let package = Package(
    name: "Project",
    dependencies: [
        .Package(url: "https://github.com/FabrizioBrancati/Queuer.git", majorVersion: 1)
    ]
)Change "Project" with your real project name
Open Terminal, go to project directory and type: swift build
Import the framework with import Queuer
Enjoy!
Queuer.shared.addOperation(operation)let queue = Queuer(name: "MyCustomQueue")You can even create a queue by defining the maxConcurrentOperationCount and the qualityOfService * properties:
let queue = Queuer(name: "MyCustomQueue", maxConcurrentOperationCount: Int.max, qualityOfService: .default)
*Currently,QualityOfServiceproperty is not directly supported on Linux, since there are not qos class promotions available outside of darwin targets.
You have three methods to add an Operation block:
Directly on the queue(or Queuer.shared):
queue.addOperation {
    /// Your task here
}Creating a ConcurrentOperation with a block:
let concurrentOperation = ConcurrentOperation {
    /// Your task here
}
queue.addOperation(concurrentOperation)Creating a SynchronousOperation with a block:
let synchronousOperation = SynchronousOperation {
    /// Your task here
}
queue.addOperation(concurrentOperation)We will see how
ConcurrentOperationandSynchronousOperationworks later.
Chained Operations are operations that add a dependency each other.
They follow the given array order, for example: [A, B, C] = A -> B -> C -> completionBlock.
let concurrentOperation1 = ConcurrentOperation {
    /// Your task 1 here
}
let concurrentOperation2 = ConcurrentOperation {
    /// Your task 2 here
}
queue.addChainedOperations([concurrentOperation1, concurrentOperation2]) {
    /// Your completion task here
}Cancel all operations in queue:
queue.cancelAll()Pause queue:
queue.pause()By calling
pause()you will not be sure that every operation will be paused. If the Operation is already started it will not be on pause until it's a custom Operation that overridespause()function or is aRequestOperation.
Resume queue:
queue.resume()To have a complete
pauseandresumestates you must create a custom Operation that overridespause()andresume()function or use aRequestOperation.
Wait until all operations are finished:
queue.waitUntilAllOperationsAreFinished()This function means that the queue will blocks the current thread until all operations are finished.
ConcurrentOperation is a class created to be subclassed.
It allows synchronous and asynchronous tasks, has a pause and resume states, can be easily added to a queue and can be created with a block.
You can create your custom ConcurrentOperation by subclassing it.
You must override execute() function and call the finish() function inside it, when the task has finished its job to notify the queue.
Look at RequestOperation.swift if you are looking for an example.
For convenience it has an init function with a completion block:
let concurrentOperation = ConcurrentOperation {
    /// Your task here
}
concurrentOperation.addToQueue(queue)There are three methods to create synchronous tasks or even queue:
maxConcurrentOperationCount of the queue to 1.1 you will be sure that only one task at time will be executed.Semaphore and waiting until a task has finished its job.SynchronousOperation.ConcurrentOperation that handles synchronous tasks.For convenience it has an init function with a completion block:
let synchronousOperation = SynchronousOperation {
  /// Your task here
}
synchronousOperation.addToQueue(queue)A Semaphore is a struct that uses the GDC's DispatchSemaphore to create a semaphore on the function and wait until it finish its job.
I recommend you to use a defer { semaphore.continue() } right after the Semaphore creation and wait() call.
let semaphore = Semaphore()
semaphore.wait()
defer { semaphore.continue() }
/// Your task hereIt's more useful if used inside an asynchronous task:
let concurrentOperation = ConcurrentOperation {
    /// Your task here
    semaphore.continue()
}
concurrentOperation.addToQueue(queue)
semaphore.wait()*RequestOperation allows you to easily create a network request and add it to a queue:
let requestOperation: RequestOperation = RequestOperation(url: self.testAddress) { success, response, data, error in
}
requestOperation.addToQueue(queue)Allowed parameters in RequestOperation init function:
url is a String representing the request URLquery is Dictionary representing the request query parameters to be added to the url with ? and & characterstimeout is the request timeoutmethod is the request method, you can choose to one of: connect, delete, get, head, options, patch, post and putcachePolicy is the request cache policy, referrer to CachePolicy documentationheaders is a Dictionary representing the request headersbody is a Data representing the request bodycompletionHandler is the request response handlerResponse handler variables:
success is a Bool indicating if the request was successful.
It's successful if its status is between 200 and 399, it wasn't cancelled and did't get any other network error.respose is an HTTPURLResponse instance.
It contains all the response headers and the status code.
May be nil.data is a Data instance with the request body.
You must convert, to a JSON or String in example, it in order to use.
May be nil.error is an Error instance with the request error.
May be nil.It can be paused, resumed, cancelled and chained with other Operations.
*Currently,URLSession.sharedproperty is not yet implemented on Linux.
100% Documented
To see what has changed in recent versions of Queuer, see the CHANGELOG.md file.
See CONTRIBUTING.md file.
Fabrizio Brancati
Website: https://www.fabriziobrancati.com
Email: fabrizio.brancati@gmail.com
Queuer is available under the MIT license. See the LICENSE file for more info.