Run asynchronous blocks synchronously
With cocoapods:
pod 'Sync'
Without cocoapods:
- Grab the
Sync.swiftfile form theSourcesfolder and add it to your project.
Or:
- Clone the repo
- Build the framework with
archive - Add the
Sync.frameworkbundle to your project
Similar to semaphores or dispatch_group, Sync mus be notified when the asynchronous block is complete. The asynchronous code can be running on a background thread:
let sync = Sync()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// Your async code in background thread
sync.complete()
}
sync.wait()...or in the main thread:
let sync = Sync()
dispatch_async(dispatch_get_main_queue()) {
// Your async code in main thread
sync.complete()
}
sync.wait()Sync waits indefinitely for the block to complete unless a timeout is specified:
let sync = Sync()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// Your async code in background thread
sync.complete()
}
sync.wait(seconds: 5) // wait at most 5 seconds and continueSync works even in cases where the completion block is called on the main thread, avoiding a deadlock. This makes it very simple to write synchronous methods that can be run on a command line application or inside an NSOperation or background thread.
func locationForString(name: String) -> CLLocation? {
var location: CLLocation?
let sync = Sync()
CLGeocoder().geocodeAddressString(name) { (placemarks, error) in
location = placemarks?.first?.location
sync.complete()
}
sync.wait(seconds: 5)
return location
}
let location = locationForString("San Francisco")
print(location.coordinate)