我正在使用Siesta REST API客户端进行swift。我正在登录外部API(成功)并从午休请求对象中获取结果。该请求有两个回调 - 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布尔值之前等待回调完成?
我很快乐,所以任何帮助都会受到赞赏。
答案 0 :(得分:3)
登录是acsync功能,因此您无法使用return 尝试关闭:
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)")
}
}
答案 1 :(得分:1)
正如@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")
}
}