Асинхронная проверка при выполнении перехода - PullRequest
0 голосов
/ 04 октября 2018

В моем приложении есть два 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)
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете ввести свойство для выполнения segue, как показано ниже,

var isLoggedIn: Bool = false {
    didSet {
        self.performSegue(withIdentifier: "loginToMain", sender: self)
    }
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    return isLoggedIn
}

@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.isLoggedIn = true
                }else{
                    print(user.msg)
                }
            }
            catch {
                print("error")
            }
        case let .failure(error):
            print(error.response?.description)
        }
    }
}
0 голосов
/ 04 октября 2018

Вы не можете использовать асинхронный метод в shouldPerformSegue, но вы можете выполнить асинхронный метод перед выполнением segue и затем вызвать performSegue(withIdentifier:sender:) в блоке завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...