Am I missing something on how the Package Manager works?

I’ve tried to make a command-line program with the Swift Package Manager, and use Foundation for networking (on macOS):

import Foundation
import Commander
import HeliumLogger
import LoggerAPI

enum ReturnCode: Int32 {
    case badUrlString = 10, retrievalError
}
HeliumLogger.use()
let main = command { (urlArgument: String) in
    guard let url = URL(string: urlArgument) else {
        Log.error("Argument \"\(urlArgument)\" cannot be converted to a URL.")
        exit(ReturnCode.badUrlString.rawValue)
    }
    let session = URLSession(configuration: .ephemeral)
    let task = session.dataTask(with: url, completionHandler: { (data, response, error) in
        if let error = error {
            Log.error("Retrieval Error: \(error)")
            exit(ReturnCode.retrievalError.rawValue)
        }
        guard let data = data else {
            print("(no data)")
            return
        }
        print(data.base64EncodedString())
        print("Hi there")
    })
    print("Hello world")
    task.resume()
}
main.run()

All I got from “swift build” and the Xcode project it made for me is just the “Hello world” message. The task block was ignored. Did I get calling it wrong?

···


Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com

I think your process terminates immediately after calling ‘task.resume()’.

You can find the same issue at https://stackoverflow.com/questions/31944011/how-to-prevent-a-command-line-tool-from-exiting-before-asynchronous-operation-co.

···

2017/08/21 14:55、Daryle Walker via swift-users <swift-users@swift.org>のメール:

I’ve tried to make a command-line program with the Swift Package Manager, and use Foundation for networking (on macOS):

import Foundation
import Commander
import HeliumLogger
import LoggerAPI

enum ReturnCode: Int32 {
    case badUrlString = 10, retrievalError
}
HeliumLogger.use()
let main = command { (urlArgument: String) in
    guard let url = URL(string: urlArgument) else {
        Log.error("Argument \"\(urlArgument)\" cannot be converted to a URL.")
        exit(ReturnCode.badUrlString.rawValue)
    }
    let session = URLSession(configuration: .ephemeral)
    let task = session.dataTask(with: url, completionHandler: { (data, response, error) in
        if let error = error {
            Log.error("Retrieval Error: \(error)")
            exit(ReturnCode.retrievalError.rawValue)
        }
        guard let data = data else {
            print("(no data)")
            return
        }
        print(data.base64EncodedString())
        print("Hi there")
    })
    print("Hello world")
    task.resume()
}
main.run()

All I got from “swift build” and the Xcode project it made for me is just the “Hello world” message. The task block was ignored. Did I get calling it wrong?


Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Thank you. I ended up using a dispatch-semaphore.

···

On Aug 21, 2017, at 4:46 AM, Tatsuyuki Kobayashi <childhoodend.tk@gmail.com> wrote:

I think your process terminates immediately after calling ‘task.resume()’.

You can find the same issue at https://stackoverflow.com/questions/31944011/how-to-prevent-a-command-line-tool-from-exiting-before-asynchronous-operation-co.


Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com