我正在开发具有登录页面的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
答案 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)