【发布时间】:2018-05-18 05:40:07
【问题描述】:
我正在尝试使用我的数据库验证用户的登录。当按下登录按钮时,我想根据从数据库返回的信息来判断是否会发生转场。我从最初设置为 true 的变量决策开始,如果我无法验证用户,我想将其设置为 false 并防止 segue。这是我的代码,但它有问题。最后的 return 语句始终为真。基本上发生的事情是在从数据库返回响应之前首先调用 .resume() 之后最后的 return 语句。有人可以澄清为什么会发生这种情况
override func shouldPerformSegue(withIdentifier identifier: String,sender:
Any?) -> Bool
{
var decision = true
let url = URL(string:"http://192.23.25.98/login/php")
var request = URLRequest(url: url!)
request.httpMethod = "POST"
let body = "UserNameLogIn=\(userName.text!.lowercased())&PasswordLogIn=\(passWord.text!.lowercased())"
request.httpBody=body.data(using: String.Encoding.utf8)
URLSession.shared.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in
if (error == nil)
{
DispatchQueue.main.async(execute: {
do
{
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? Dictionary<AnyHashable,AnyObject>
guard let parseJson = json else{
print ("error parsing")
return
}
let status = parseJson["status"]
if (status != nil)
{
if (parseJson.count>3)
{
decision = true
}
else
{
decision = false
}
}
}
catch
{
print("error: \(error)")
}
})
}
else
{
decision = false
}
}.resume()
return decision
}
【问题讨论】:
-
您不能执行异步操作来从
shouldPerformSegue返回值。 -
我试过 DispatchQueue.main.sync 还是不行
-
没关系,数据任务还是异步的。
-
抱歉,您能否进一步详细说明。你的意思是 URLSession.shared.dataTask 总是异步的?
-
是的。您需要在不进行任何网络访问的情况下在瞬间做出决定。