我正在撰寫一個簡單的程式,旨在與服務器交談,獲取一些資訊并顯示它。但是,我遇到了異步代碼的問題,主要是代碼沒有停止以允許服務器在繼續之前做出回應。
我知道我必須做錯事,但不知道是什么,感謝任何幫助。
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 ""
}
}
uj5u.com熱心網友回復:
getToken()如果我理解了這個問題,你會在方法完成之前看到“Done”被列印出來,對吧?
問題是print("Done")在Task.
當您呼叫時Task,它開始運行閉包中的內容,并在閉包后立即恢復,而您的任務在后臺運行。
將您print()的Task閉包放在getToken()方法之后,您會看到在完成 POST 請求后它會“完成”。
Task{
let accessToken = await getToken()
print("Done")
}
uj5u.com熱心網友回復:
Await 不會完全阻塞您的代碼,而是可以使用進行呼叫的執行緒來執行其他操作,例如獲取更多用戶輸入、執行其他正在等待結果但現在擁有結果的任務內容。像閉包回呼一樣思考,等待之后的所有內容都將在稍后執行,可能直到封閉任務。Print(“done”) 不在您的任務中,因此不需要等待任務中的代碼執行,任務內容很可能在另一個執行緒中執行,因為它不包含必須在主執行緒中執行的代碼線。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437405.html
