How to create dispatch queue in Swift 3
Creating a concurrent queue
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)concurrentQueue.sync {}
Create a serial queue
let serialQueue = DispatchQueue(label: "queuename")serialQueue.sync { }
Get main queue asynchronously
DispatchQueue.main.async {}
Get main queue synchronously
DispatchQueue.main.sync {}
To get one of the background thread
DispatchQueue.global(qos: .background).async {}
Xcode 8.2 beta 2:
To get one of the background thread
DispatchQueue.global(qos: .default).async {}DispatchQueue.global().async { // qos' default value is ´DispatchQoS.QoSClass.default`}
If you want to learn about using these queues .See this answer
Compiles under >=Swift 3. This example contains most of the syntax that we need.
QoS - new quality of service syntax
weak self
- to disrupt retain cycles
if self is not available, do nothing
async global utility queue
- for network query, does not wait for the result, it is a concurrent queue, the block (usually) does not wait when started. Exception for a concurrent queue could be, when its task limit has been previously reached, then the queue temporarily turns into a serial queue and waits until some previous task in that queue completes.
async main queue
- for touching the UI, the block does not wait for the result, but waits for its slot at the start. The main queue is a serial queue.
Of course, you need to add some error checking to this...
DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in guard let strongSelf = self else { return } strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in if error != nil { print("error:\(error)") } else { DispatchQueue.main.async { () -> Void in activityIndicator.removeFromSuperview() strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage } } }}
Compiled in XCode 8, Swift 3https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) { let thisEmail = "emailaddress.com" let thisPassword = "myPassword" DispatchQueue.global(qos: .background).async { // Validate user input let result = self.validate(thisEmail, password: thisPassword) // Go back to the main thread to update the UI DispatchQueue.main.async { if !result { self.displayFailureAlert() } } }}