How to prevent a Command Line Tool from exiting before asynchronous operation completes How to prevent a Command Line Tool from exiting before asynchronous operation completes xcode xcode

How to prevent a Command Line Tool from exiting before asynchronous operation completes


Adding RunLoop.main.run() to the end of the file is one option. More info on another approach using a semaphore here


I realize this is an old question, but here is the solution I ended on. Using DispatchGroup.

let dispatchGroup = DispatchGroup()for someItem in items {    dispatchGroup.enter()    doSomeAsyncWork(item: someItem) {        dispatchGroup.leave()    }}dispatchGroup.notify(queue: DispatchQueue.main) {    exit(EXIT_SUCCESS)}dispatchMain()


You can call dispatchMain() at the end of main. That runs the GCD main queue dispatcher and never returns so it will prevent the main thread from exiting. Then you just need to explicitly call exit() to exit the application when you are ready (otherwise the command line app will hang).

import Foundationlet url = URL(string:"http://www.stackoverflow.com")!let dataTask = URLSession.shared.dataTask(with:url) { (data, response, error) in    // handle the network response    print("data=\(data)")    print("response=\(response)")    print("error=\(error)")    // explicitly exit the program after response is handled    exit(EXIT_SUCCESS)}dataTask.resume()// Run GCD main dispatcher, this function never returns, call exit() elsewhere to quit the program or it will hangdispatchMain()