Skip to content

Instantly share code, notes, and snippets.

@TiagoBras
Created April 18, 2019 11:07
Show Gist options
  • Select an option

  • Save TiagoBras/3fea72326303edcb64413fde647fde0a to your computer and use it in GitHub Desktop.

Select an option

Save TiagoBras/3fea72326303edcb64413fde647fde0a to your computer and use it in GitHub Desktop.
DispatchQueue extension for situations where one needs to run an expensive operation in background and then use its result in the main thread
import Foundation
extension DispatchQueue {
func asyncConsumeInMainQueue<T>(
work: @escaping () throws -> T,
mainSuccess: @escaping (T) -> Void,
mainError: @escaping (Error) -> Void) {
async {
do {
let result = try work()
DispatchQueue.main.async {
mainSuccess(result)
}
} catch {
DispatchQueue.main.async {
mainError(error)
}
}
}
}
func asyncConsumeInMainQueue<T>(
delay: TimeInterval,
work: @escaping () throws -> T,
mainSuccess: @escaping (T) -> Void,
mainError: @escaping (Error) -> Void) {
asyncAfter(deadline: .now() + delay) {
do {
let result = try work()
DispatchQueue.main.async {
mainSuccess(result)
}
} catch {
DispatchQueue.main.async {
mainError(error)
}
}
}
}
}
@TiagoBras
Copy link
Author

Example:

DispatchQueue.global(qos: .background).asyncConsumeInMainQueue(work: { () -> UIImage in
    return try fetchImage(url: "https://example.com/image.jpeg")
}, mainSuccess: { [weak self] (image) in
    self?.imageView.image = image
}) { (error) in
    handleError(error)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment