Как создать правильный обработчик завершения для входа на сервер в swift? - PullRequest
0 голосов
/ 06 мая 2018

В моем приложении swift есть класс api manager, и у него есть логин на сервере с именем пользователя и паролем. Я хочу знать, как создать обработчик завершения для него, чтобы, когда сервер отвечает 200 кодом состояния, функция обрабатывает этот ответ и, например, выполняет переход в viewcontroller. Я не нашел никаких учебных пособий для этого. Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ 1: Что мне нужно, это: обработчик завершения сразу запускается при вызове функции. Я хочу запустить обработчик завершения после ответа сервера.

И это моя функция входа в систему:

public class func Login(username: String, password: String, complitionHandler: @escaping (Int) -> Void) {

        let urlS = "http://server.com/" + "login.php"
        let url = URL(string: urlS)
        var request = URLRequest(url: url!)
        request.httpMethod = "POST"
        let body = "username=\(username.lowercased())&password=\(password)"
        request.httpBody = body.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            guard let data = data, error == nil else {
                print(error!)
                print("error")
                logedIn = 2
                return
            }
            do{
                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary
                if let parseJson = json {
                    let code = parseJson["status"] as! String
                    if code == "200" {

                        print("loged inn")
                        logedIn = 1
                    }else if code == "400" {
                        print("uuuser/pass error")
                        logedIn = 0
                    }
                }

            }catch{
                print("json error")
                logedIn = 2
            }
        }
        task.resume()

    DispatchQueue.main.async {
        complitionHandler(logedIn)
    }

    }

И как я вызываю функцию в моем ViewController:

Manager.Login(username: "1", password: "1") { (i) in
            switch i {
            case 0:
                print("user/pass error")
            case 1:
                print("loged in")
                self.performSegue(withIdentifier: "toMain", sender: self)
            case 2:
                print("json error")
            default:
                ()
            }
        }

1 Ответ

0 голосов
/ 06 мая 2018

У вас есть все части на месте. Вам просто нужно переместить ваш вызов обработчику завершения в правильное место:

        }catch{
            print("json error")
            logedIn = 2
        }
        DispatchQueue.main.async {
            complitionHandler(logedIn)
        }
    }
    task.resume()

Также обратите внимание, что имена методов должны начинаться со строчных букв, поэтому ваша функция Login должна называться login.

Теперь вы можете использовать этот login метод, например:

login(username: someUsername, password: somePassword) { (result) in
    if result == 1 {
        // success - do your segue
    } else if result == 0 {
        // bad username/password
    } else {
        // some error
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...