Swift - Async/Await 不停下来让任务完成

Swift - Async/Await not stopping to let task finish

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

我知道我一定做错了什么,但不知道是什么,感谢您的帮助。

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 ""
    }
}

如果我理解这个问题,您会看到在 getToken() 方法完成之前打印了“完成”,对吗?

问题是 print("Done")Task 之外。

当您调用 Task 时,它会启动 运行 闭包中的内容,并在闭包后 立即 恢复,而您的任务是 运行 在后台。

将你的 print() 放在 Task 闭包中,紧跟在 getToken() 方法之后,你会看到它会在你完成你的 POST请求。

    Task{
        let accessToken = await getToken()
        print("Done")
    }

Await 不会完全阻塞您的代码,相反,发出调用的线程可用于执行其他操作,例如获取更多用户输入、执行其他等待结果且现在已获得结果的任务内容。像闭包回调一样思考,等待之后的所有内容都将在稍后执行,可能会执行到封闭任务。 Print(“done”) 不在你的任务中,所以不需要等待任务中的代码执行,任务内容很可能在另一个线程中执行,因为它不包含必须在主线程中执行的代码线程。