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)
如果我理解这个问题,你会看到“完成”在getToken()如果我理解这个问题,您会看到在方法完成
问题是print("Done")在外面Task.
当您调用 时,它会立即Task开始运行闭包中的内容恢复,同时您的任务并行运行,而不会阻塞主线程。
将您的代码放在闭print()包内Task,就在该getToken()方法之后,您将看到在完成 POST 请求后它将“完成”。
Task{
let accessToken = await getToken()
print("Done")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3517 次 |
| 最近记录: |