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”) 不在你的任务中,所以不需要等待任务中的代码执行,任务内容很可能在另一个线程中执行,因为它不包含必须在主线程中执行的代码线程。
我正在编写一个简单的程序,旨在与服务器对话、获取一些信息并显示它。但是,我 运行 遇到了异步代码的问题,主要是代码没有停止以允许服务器在继续之前做出响应。
我知道我一定做错了什么,但不知道是什么,感谢您的帮助。
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”) 不在你的任务中,所以不需要等待任务中的代码执行,任务内容很可能在另一个线程中执行,因为它不包含必须在主线程中执行的代码线程。