Используйте пример кода Swift URLSession в инструменте командной строки

Я пытаюсь найти самый простой способ сделать HTTP-запрос в Swift 4 из командной строки. Я скопировал этот код из Руководство по программированию сеансов URL и добавил пару операторов печати. Я не могу понять, почему .dataTask не выполняется.

print("Testing URLSession")
let sessionWithoutADelegate = URLSession(configuration: URLSessionConfiguration.default)
if let url = URL(string: "https://www.example.com/") {
    print("Encoded url \(url)")
    (sessionWithoutADelegate.dataTask(with: url) { (data, response, error) in
        print("Executing dataTask")
        if let error = error {
            print("Error: \(error)")
        } else if let response = response,
            let data = data,
            let string = String(data: data, encoding: .utf8) {
            print("Response: \(response)")
            print("DATA:\n\(string)\nEND DATA\n")
        }
    }).resume()
}

Цель состоит в том, чтобы получить данные из API REST, но я даже не могу сделать простой запрос GET, чтобы он работал правильно...


person mooglinux    schedule 20.09.2017    source источник
comment
Это в приложении iOS или macOS или в приложении командной строки? Или на детской площадке?   -  person Martin R    schedule 20.09.2017
comment
Это в приложении командной строки. Я попробовал это на игровой площадке, но, похоже, он не работал правильно, потому что перестал отображать значения с правой стороны, даже для таких вещей, как операторы печати.   -  person mooglinux    schedule 20.09.2017
comment
... У вас есть код после закрывающей фигурной скобки или программа заканчивается там? URLSessionTask выполняется асинхронно, поэтому, если программа завершается до завершения, вы никогда не увидите ее результата.   -  person NobodyNada    schedule 20.09.2017
comment
добавить это PlaygroundPage.current.needsIndefiniteExecution = true на игровую площадку   -  person Nazmul Hasan    schedule 20.09.2017
comment
Добавление этого по-прежнему не заставляет Playground работать.   -  person mooglinux    schedule 20.09.2017
comment
Итак, как мне заставить систему ждать завершения URLSessionTask?   -  person mooglinux    schedule 20.09.2017
comment
Вы можете запустить цикл выполнения: CFRunLoopRun()   -  person Ssswift    schedule 21.09.2017


Ответы (1)


Наконец-то я понял, как заставить его работать с помощью CFRunLoop:

let runLoop = CFRunLoopGetCurrent()
let task = session.dataTask(with: request) { (data, response, error) in
    print("Retrieved data")
    CFRunLoopStop(runLoop)
}
task.resume()
CFRunLoopRun()
print("done")
person mooglinux    schedule 06.12.2017