Search code examples
swiftalamofireswift-package-manager

Swift wait for closure thread to finish


I'm using a very simple swift project created with SPM where it includes Alamofire.

main.swift:

import Alamofire

Alamofire.request("https://google.com").responseString(queue: queue) { response in
            print("\(response.result.isSuccess)")
}

The closure is never executed if I don't use a lock. Is there a way to instruct to wait for all threads or that specific thread before exiting?

I'm aware this can be easily achieved using Playgrounds.


Solution

  • Simplest way to wait for an async task is to use a semaphore:

    let semaphore = DispatchSemaphore(value: 0)
    
    doSomethingAsync {
        semaphore.signal()
    }
    
    semaphore.wait()
    
    // your code will not get here until the async task completes
    

    Alternatively, if you're waiting for multiple tasks, you can use a dispatch group:

    let group = DispatchGroup()
    
    group.enter()
    doAsyncTask1 {
        group.leave()
    }
    
    group.enter()
    doAsyncTask2 {
        group.leave()
    }
    
    group.wait()
    
    // You won't get here until all your tasks are done