Modern versions of Swift use DispatchQueue.main.async
to dispatch to the main thread:
DispatchQueue.main.async {
// your code here
}
To dispatch after on the main queue, use:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
Older versions of Swift used:
dispatch_async(dispatch_get_main_queue(), {
let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
delegateObj.addUIImage("yourstring")
})
Swift 3+ & Swift 4 version:
DispatchQueue.main.async {
print("Hello")
}
Swift 3 and Xcode 9.2:
dispatch_async_on_main_queue {
print("Hello")
}
Swift 2
Using Trailing Closures this becomes:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
Trailing Closures is Swift syntactic sugar that enables defining the closure outside of the function parameter scope. For more information see Trailing Closures in Swift 2.2 Programming Language Guide.
In dispatch_async case the API is func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
since dispatch_block_t
is type alias for () -> Void
- A closure that receives 0 parameters and does not have a return value, and block being the last parameter of the function we can define the closure in the outer scope of dispatch_async
.
Reload collectionView on Main Thread
DispatchQueue.main.async {
self.collectionView.reloadData()
}
Here's the nicer (IMO) Swifty/Cocoa style syntax to achieve the same result as the other answers:
NSOperationQueue.mainQueue().addOperationWithBlock({
// Your code here
})
Or you could grab the popular Async Swift library for even less code and more functionality:
Async.main {
// Your code here
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With