Swift - 异步/等待不停止让任务完成

ZHa*_*ach 2 asynchronous async-await completionhandler swift

我正在编写一个简单的程序,旨在与服务器通信,获取一些信息并显示它。但是,我遇到了异步代码的问题,主要是代码没有停止以允许服务器在继续之前做出响应。

我知道我一定做错了什么,但不知道是什么,非常感谢任何帮助。

override func viewDidLoad() {
    super.viewDidLoad()
    Task{
        let accessToken = await getToken()
    }
    print("Done")
}

private func getToken() async -> String{
    let url = URL(string: "https://api.petfinder.com/v2/oauth2/token")
    let payload = "grant_type=client_credentials&client_id=GUQj1MdQN3QunoxXz4vdd0DHPlcJC6yuqCLCEXavriJ4W6wTYV&client_secret=7whgSG3ZX6m9Cwfr2vEakOH90fSn3g0isIlae0CC".data(using: .utf8)
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.httpBody = payload

    do{
        let (data,_) = try await URLSession.shared.data(for: request)
        let APItoken: token = try! JSONDecoder().decode(token.self, from: data)
        return APItoken.access_token
    }
    catch{
        return ""
    }
}
Run Code Online (Sandbox Code Playgroud)

Hun*_*ion 5

如果我理解这个问题,你会看到“完成”在getToken()如果我理解这个问题,您会看到在方法完成

问题是print("Done")在外面Task.

当您调用 时,它会立即Task开始运行闭包中的内容恢复,同时您的任务并行运行,而不会阻塞主线程。

将您的代码放在闭print()包内Task,就在该getToken()方法之后,您将看到在完成 POST 请求后它将“完成”。

    Task{
        let accessToken = await getToken()
        print("Done")
    }
Run Code Online (Sandbox Code Playgroud)