Xcode、swift:执行时出现 SIGABRT 错误
Xcode, swift: SIGABRT error on performsegue
我是 swift 的新手,我刚刚开始从事这个项目。这是 ios 的登录应用程序。这是 "Log In" 按钮的代码。 "Parola" 顺便说一句,意思是 "password"。
@IBAction func loginButton(_ sender: Any) {
let Email = emailText.text;
let Parola = parolaText.text;
if((Email?.isEmpty)! || (Parola?.isEmpty)!){
print("Empty field!")
} else {
let myUrl = NSURL(string: "http://my.url/webservice.php");
let request = NSMutableURLRequest(url:myUrl! as URL);
request.httpMethod = "POST";
let postString = "email=\(String(describing: Email!))&password=\(String(describing: Parola!))";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request as URLRequest){
data, response, error in
if error != nil {
print("error=\(String(describing: error))")
return
}
var err: NSError?
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
var resultValue:String = parseJSON["status"] as! String;
print("result: \(resultValue)");
if(resultValue == "Success"){
self.performSegue(withIdentifier: "LogPers", sender: nil)
}
}
} catch let error as NSError {
err = error
}
}
task.resume()
}
}
它通过使用网络服务连接到外部数据库来验证输入的用户信息。一切正常。
我的问题是应用程序尝试执行 segue 时出现 SIGABRT 错误。我试着在网上搜索这个问题,所有的消息来源都说这个错误是由有问题的插座和连接引起的,但我所有的插座都没有问题。
如果我在 "let task = URLSession.shared.dataTask(with: request as URLRequest){" 结构之外使用 segue,它可以在没有 SIGABRT 错误的情况下执行,但我需要它在内部,所以只有当用户输入正确时它才会转移到第二个视图。
我该如何解决这个问题?提前致谢。
请记住,我是 xcode 和 swift 的初学者,如果这是一个愚蠢的问题,我深表歉意。
崩溃是因为您试图在后台线程上执行 segue(因为 performSegue
调用在 URLSession 回调中)。任何在主线程上处理视图 needs 到 运行 的代码。
尝试将您的 performSegue
调用包装在 DispatchQueue 块中,如下所示:
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LogPers", sender: nil)
}
我是 swift 的新手,我刚刚开始从事这个项目。这是 ios 的登录应用程序。这是 "Log In" 按钮的代码。 "Parola" 顺便说一句,意思是 "password"。
@IBAction func loginButton(_ sender: Any) {
let Email = emailText.text;
let Parola = parolaText.text;
if((Email?.isEmpty)! || (Parola?.isEmpty)!){
print("Empty field!")
} else {
let myUrl = NSURL(string: "http://my.url/webservice.php");
let request = NSMutableURLRequest(url:myUrl! as URL);
request.httpMethod = "POST";
let postString = "email=\(String(describing: Email!))&password=\(String(describing: Parola!))";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request as URLRequest){
data, response, error in
if error != nil {
print("error=\(String(describing: error))")
return
}
var err: NSError?
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
var resultValue:String = parseJSON["status"] as! String;
print("result: \(resultValue)");
if(resultValue == "Success"){
self.performSegue(withIdentifier: "LogPers", sender: nil)
}
}
} catch let error as NSError {
err = error
}
}
task.resume()
}
}
它通过使用网络服务连接到外部数据库来验证输入的用户信息。一切正常。
我的问题是应用程序尝试执行 segue 时出现 SIGABRT 错误。我试着在网上搜索这个问题,所有的消息来源都说这个错误是由有问题的插座和连接引起的,但我所有的插座都没有问题。
如果我在 "let task = URLSession.shared.dataTask(with: request as URLRequest){" 结构之外使用 segue,它可以在没有 SIGABRT 错误的情况下执行,但我需要它在内部,所以只有当用户输入正确时它才会转移到第二个视图。
我该如何解决这个问题?提前致谢。
请记住,我是 xcode 和 swift 的初学者,如果这是一个愚蠢的问题,我深表歉意。
崩溃是因为您试图在后台线程上执行 segue(因为 performSegue
调用在 URLSession 回调中)。任何在主线程上处理视图 needs 到 运行 的代码。
尝试将您的 performSegue
调用包装在 DispatchQueue 块中,如下所示:
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LogPers", sender: nil)
}