[英]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.