MacOS завершить почтовый запрос, затем перейти - PullRequest
0 голосов
/ 23 апреля 2019

Я занимаюсь разработкой приложения для MacOS со страницей входа.Когда пользователь нажал кнопку входа в систему, мне нужно отправить запрос на публикацию, и если ответ имеет код 200, тогда мне нужно предварительно выполнить переход.

Я сталкиваюсь с проблемой, при которой происходит переход, независимо от того, чтоя пытаюсь

Я пытался использовать IBAction для кнопки, затем вызывая seform preform, однако это привело к проблеме потока.Теперь я поместил все в shouldPerformSegue

override func shouldPerformSegue(withIdentifier identifier: NSStoryboardSegue.Identifier, sender: Any?) -> Bool {

        if emailTextField.stringValue.isEmpty || passwordTextField.stringValue.isEmpty {
            instructionText.stringValue = "Email and Password Required"
            return false
        }

        let emailPassword = "email="+emailTextField.stringValue+"&password="+passwordTextField.stringValue
        print("before post")
        let data = emailPassword.data(using: String.Encoding.ascii, allowLossyConversion: false)
        let url = URL(string: "http://127.0.0.1:50896/api/v1/auth")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = data
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                print("error: \(error)")
            } else {
                if let response = response as? HTTPURLResponse {
                    print("statusCode: \(response.statusCode)")
                }
                if let data = data, let dataString = String(data: data, encoding: .utf8) {
                    print("data: \(dataString)")
                }
            }
        }
        task.resume()

        return true
    }

Я хотел бы завершить пост-запрос, проверьте код ответа, а затем выполните преформу segue, если код 200

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

Проблема в том, что task.resume () асинхронный; поэтому его результат бесполезен, потому что вы уже возвращаете метод shouldPerformSegue () с истинным значением. По сути, это означает, что задание выполняется когда-то ПОСЛЕ того, как вы сказали: «Это нормально, чтобы выполнить переход». Вместо этого вызовите задачу с помощью кнопки IBAction и выполните переход в разделе 200 кода состояния. Удачи!

Редактировать: проблема с IBAction, вероятно, связана с тем, что вы выполняете работу с основным потоком в автономном режиме (обновления пользовательского интерфейса, executeSegue, ...). Проверьте В Swift, как вызвать метод с параметрами в главном потоке GCD?

0 голосов
/ 23 апреля 2019

Один из способов сделать это - использовать с обратным вызовом завершения, используя замыкания.

func shouldPerformSegue(withIdentifier identifier: NSStoryboardSegue.Identifier, sender: Any?,OnSucess sucess:@escaping(Bool)->Void){
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if let error = error {
            print("error: \(error)")
            sucess(false)
        } else
        {
            if let response = response as? HTTPURLResponse {

                print("statusCode: \(response.statusCode)")
            }
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                print("data: \(dataString)")
            }
            sucess(true)
        }
    }
}

let identiferStory: NSStoryboardSegue.Identifier = "main"
shouldPerformSegue(withIdentifier: identiferStory, sender: nil) { (isSucess) in
    if isSucess == true{

    }
    else{

    }
}
0 голосов
/ 23 апреля 2019

Вы должны возвращать true, только если ответ равен 200.

shouldPerformSegue

При получении значения false игнорируется последовательность.

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