【问题标题】:performSegueWithIdentifier while in URLSession.shared.dataTask(with: url)在 URLSession.shared.dataTask(with: url) 中执行SegueWithIdentifier
【发布时间】: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


【解决方案1】:

根据异常原因,你必须在主线程上执行 segue

DispatchQueue.main.async {
    self.performSegue(withIdentifier: "Login", sender: self)
}

【讨论】:

  • 那行得通,我还将 if 语句放入 do catch。感谢您的快速解决方案。现在我可以开始搜索为什么我需要 DispatchQueue。
  • dataTask 被调度到后台线程以保持 UI 响应,并且所有影响 UI 的操作都必须在主线程上执行。 DispatchQueue 处理得非常方便。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2016-04-23
  • 2022-11-07
  • 2017-12-09
  • 2019-03-16
  • 1970-01-01
  • 2019-09-16
  • 2017-08-20
相关资源
最近更新 更多