В моем приложении есть два ViewController, LoginViewController, MainViewController
В раскадровке я создал переход от LoginViewController к MainViewController
И теперь я использую Мойю для реализации функции входа в систему, но я хочучтобы сохранить последовательность
Поэтому я пишу эту функцию в LoginViewController
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
var ret = false
let provider = MoyaProvider<MyApi>()
provider.request(.login(username : inUsername.text! , password : inPassword.text! )) { result in
switch result {
case let .success(moyaResponse):
let data = moyaResponse.data
do {
let decoder = JSONDecoder()
let user = try decoder.decode(Login.self, from: data)
if(user.status == 1){
ret = true
}else{
print(user.msg)
}
}
catch {
print("error")
}
case let .failure(error):
ret = false
}
}
return ret
}
Но мой запрос является асинхронным, эта функция будет возвращаться до ответа, поэтому эта функция никогда не вернет true
Как заставить это работать?
обновление:
Теперь я перемещаю запрос на кнопку IBAction, но он все равно не работает
, если я удаляю shouldPerformSegue
, он по-прежнему переходит к следующему viewcontroller перед обратным вызовом
, если я верну true в shouldPerformSegue
, он перейдет к следующему viewcontroller, даже если ошибка входа в систему
, если я верну false в shouldPerformSegue
, он будетне переходить к следующему viewcontroller даже при успешном входе в систему
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
return true // always to next
return false // never to next
}
@IBAction func clickLogin(_ sender: Any) {
let provider = MoyaProvider<ZfuApi>()
provider.request(.login(username : inUsername.text! , password : inPassword.text! )) { result in
switch result {
case let .success(moyaResponse):
let data = moyaResponse.data
do {
let decoder = JSONDecoder()
let user = try decoder.decode(Login.self, from: data)
if(user.status == 1){
self.performSegue(withIdentifier: "loginToMain", sender: sender)
}else{
print(user.msg)
}
}
catch {
print("error")
}
case let .failure(error):
print(error.response?.description)
}
}
}