[英]performSegueWithIdentifier while in URLSession.shared.dataTask(with: url)
I am checking on a test Server if a user is registered. 我正在测试服务器上检查用户是否已注册。 If the server gives back, that the username and password are true, i want to perform a Segue with the identifier "Login". 如果服务器返回,则用户名和密码为true,我想使用标识符“ Login”执行Segue。 If I put the performeSegue inside the URLSession dataTask the program crashes with this error: "terminating with uncaught exception of type NSException" I don't know what to do. 如果我将performeSegue放在URLSession dataTask内,程序将因以下错误而崩溃:“终止为NSException类型的未捕获异常”,我不知道该怎么办。 because of the resume() function I can't put the performSegue outside of the dataTask. 由于resume()函数的原因,我不能将performSegue放在dataTask之外。 It would be executed before i get the data from the server. 它会在我从服务器获取数据之前执行。
Here is my Code: 这是我的代码:
@IBAction func login(_ sender: AnyObject) {
var session:String?
if userName.text!.isEmpty || logInPassword.text!.isEmpty{
let noUserName = UIAlertController(title: "Kein Benutzername oder Passwort", message: "Bitte geben sie einen Benutzernamen und ein Passwort ein.", preferredStyle: .alert)
noUserName.addAction(OKAction)
self.present(noUserName, animated: true)
} else {
//Implementing URLSession
let urlString = "http://www.***.me/playground/api/v1/user/login/\(userName.text!)/\(logInPassword.text!)"
guard let url = URL(string: urlString) else {
print("Error: couldn't open link")
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let responseData = data else {
print("Error: did not receive data")
return
}
//Implement JSON decoding and parsing
do {
//Decode retrived data with JSONDecoder and assing type of Article object
let personsData = try JSONDecoder().decode(LoginTest.self, from: responseData)
session = personsData.session
dump(personsData)
} catch let jsonError {
print("Error: \(jsonError)")
}
if session != nil{
//loging in
print("now loged in")
self.performSegue(withIdentifier: "Login", sender: self)
//here it crashes
} else {
let alertWrongPassword = UIAlertController(title: "Benutzername und Passwort stimmen nicht überein", message: "Bitte versuchen Sie es erneut.", preferredStyle: .alert)
alertWrongPassword.addAction(self.OKAction)
self.present(alertWrongPassword, animated: true)
}
}.resume()
//End implementing URLSession
}
}
According to the exception reason you have to perform the segue on the main thread 根据异常原因,您必须在主线程上执行segue
DispatchQueue.main.async {
self.performSegue(withIdentifier: "Login", sender: self)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.