MacOS完成发布请求,然后查询

时间:2019-04-23 14:43:10

标签: swift xcode macos

我正在开发具有登录页面的MacOS应用。当用户按下登录按钮时,我需要发送一个发布请求,如果响应是代码200,那么我需要执行一次segue。

无论我尝试什么,我都会遇到segue发生的问题

我尝试将IBAction用于按钮,然后调用瓶坯segue,但是这导致线程问题。我现在将所有内容都放入了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
    }

我想完成发布请求,检查响应代码,然后如果代码是200,则执行segue

3 个答案:

答案 0 :(得分:0)

问题是-task.resume()是异步的;因此它的结果是无用的,因为您已经从shouldPerformSegue()返回了一个真实值。从本质上讲,这意味着任务在您说“执行segue没关系”之后的某个时间执行。而是,从按钮IBAction调用任务,并在200状态代码部分中执行segue。祝你好运!

编辑:IBAction的线程问题可能是因为您正在非线程(UI更新,performSegue等)上执行主线程操作。检出In Swift how to call method with parameters on GCD main thread?

答案 1 :(得分:0)

一种实现方法是与闭包一起使用完成回调。

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{

    }
}

答案 2 :(得分:-1)

仅当响应为200时,才应返回true。

shouldPerformSegue

假为假将忽略segue。