【发布时间】:2018-12-15 00:18:23
【问题描述】:
如果用户已注册,我正在测试服务器上进行检查。如果服务器返回,用户名和密码为真,我想使用标识符“登录”执行 Segue。如果我将 performeSegue 放在 URLSession dataTask 中,程序会因以下错误而崩溃:“以 NSException 类型的未捕获异常终止” 我不知道该怎么办。由于 resume() 函数,我不能将 performSegue 放在 dataTask 之外。它会在我从服务器获取数据之前执行。
这是我的代码:
@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
}
}
【问题讨论】:
-
设置异常断点。它为您提供有关异常类型和原因的更多信息。似乎崩溃原因与该代码没有直接关系。你应该把 good 代码放到
do范围内——这样可以避免检查session != nil——把bad 代码放到catch范围内 -
也许这有帮助,它也在崩溃日志中:在从主线程访问引擎后,此应用程序正在从后台线程修改自动布局引擎。这可能会导致引擎损坏和奇怪的崩溃。
-
但如果我想在那里执行 segue,它只会崩溃。如果我把它放在函数的开头,它完全可以正常工作,只是没有 if 语句
标签: ios swift urlsession