[英]Swift Wait for Callback to finish before method return
我正在使用Siesta REST API客戶端進行快速處理。 我正在成功登錄到外部API,並從siesta請求對象獲取結果。 該請求具有兩個回調-onSuccess和onFailure。
如果登錄成功,那么我會在鑰匙串中設置一個令牌,然后將結果返回給視圖控制器-如果成功,它將選擇一個新的視圖控制器。
但是,由於我假設回調是異步使用的,所以我的函數未返回正確的結果。
@IBAction func normalLoginButton(_ sender: UIButton) {
//do normal login
let standardLogin = StandardLogin()
let credentials = ["email" : "john@example.com", "password": "password" ]
let loginResult = standardLogin.login(params: credentials)
print(loginResult)
if loginResult {
performSegue(withIdentifier: "showSuccessfulLoginView", sender: self)
}
}
func login(params : Dictionary<String,String>) -> Bool{
var loginSuccess = false
let loginRequest = wrApi.makePostRequest(route: "login", params:params)
loginRequest
.onSuccess { data in
print("succes")
self.setJwtToken(jsonData: data.content)
loginSuccess = true
}
.onFailure { error in print("an error occured")
}
return loginSuccess
}
我的問題基本上是在返回loginSuccess布爾值之前如何等待回調完成?
我很快就很新,因此任何幫助將不勝感激。
login是acsync函數,因此您不能使用return try閉包:
func login(params : Dictionary<String,String>, handleFinish:((isOK:Bool,param: Type?)->())){
var loginSuccess = false
let loginRequest = wrApi.makePostRequest(route: "login", params:params)
loginRequest
.onSuccess { data in
print("succes")
self.setJwtToken(jsonData: data.content)
loginSuccess = true
handleFinish(isOK: true, param :data.content )
}
.onFailure { error in
print("an error occured")
handleFinish(isOK: false, param :nil )
}
}
並稱之為:
login(param) { (isOK, param) in
if isOK{
print("login success: \(param)")
}
}
正如@Nguyen指出的那樣,您不能從異步函數返回立即值。 鑒於您對返回值所做的全部工作就是執行segue-只需將該調用移至完成處理程序即可
@IBAction func normalLoginButton(_ sender: UIButton) {
//do normal login
let standardLogin = StandardLogin()
let credentials = ["email" : "john@example.com", "password": "password" ]
standardLogin.login(params: credentials)
}
func login(params : Dictionary<String,String>){
let loginRequest = wrApi.makePostRequest(route: "login", params:params)
loginRequest
.onSuccess { data in
print("success")
self.setJwtToken(jsonData: data.content)
performSegue(withIdentifier: "showSuccessfulLoginView", sender: self)
}
.onFailure { error in print("an error occured")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.