我应该如何处理 shouldPerformSegueWithIdentifier 中的 Alamofire 响应?
How should i handle Alamofire response in shouldPerformSegueWithIdentifier?
我正在努力学习 Swift,我想做的是创建简单的登录页面。每当用户单击登录按钮时,我都会在 shouldPerformSegueWithIdentifier 中向我的 Web 服务发出请求,以检查用户名和密码是否正确。我不想使用 IBAction(如 touchupinside 等)。解析来自 Web 服务的响应后,我检查是否有任何错误来自 Web 服务响应(例如用户名无效)。如果有任何错误,我想通过 returning false 来防止 segue。但是我不能在 Alamofire 中 return false。那我应该怎么处理呢?这是我的代码:
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLoginToMainPage" {
//...
//Checking if text fields are filled or not
else {
let callURL : String = CONFIG.BASE_URL + "user/login"
let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text,
HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text]
Alamofire.request(.POST, callURL, parameters: parameters)
.responseJSON { (_,_,JSON,_) in
var returnedData = JSON as NSDictionary
if returnedData["status"] as String == "error" {
//thats what i want to do
return false
}
}
}
}
return true
}
但是我不能做 return false 因为它是异步的。我在 Whosebug 中发现了一些类似的问题,但答案并不是我想要的。谢谢!
您根本不应该尝试在 shouldPerformSegueWithIdentifier
中使用异步方法。相反,你应该:
从登录按钮本身删除 segue。
在视图控制器本身之间添加 segue。具体来说,control-从原始场景的视图控制器图标拖动(在 Xcode 6+ 中,此图标位于场景上方的栏中,在早期版本中 Xcode, 这个图标在场景下方的栏中) 到目标场景。
给这个新的segue一个"storyboard identifier".
将登录按钮连接到 IBAction
函数。
在那个 IBAction
函数中,执行您的异步网络请求,如果登录成功,则以编程方式 performSegueWithIdentifier
,提供您在步骤 3 中指定的故事板标识符.
我认为在这种情况下不使用 IBAction 是一个很好的解决方案,但无论如何有一个解决方法可以实现您的目标。对于此解决方法,您需要声明一个类型为布尔值的变量来检查用户是否准备好登录。您的 shouldPerformSegueWithIdentifier 方法应该始终 return 该变量的值,但在您发出请求之后。最后在您的异步请求完成后调用 prepareForSegue 方法
var readyForLogin = false
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLoginToMainPage" {
//...
//Checking if text fields are filled or not
else {
if(!readyForLogin){
let callURL : String = CONFIG.BASE_URL + "user/login"
let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text,
HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text]
Alamofire.request(.POST, callURL, parameters: parameters)
.responseJSON { (_,_,JSON,_) in
var returnedData = JSON as NSDictionary
if returnedData["status"] as String != "error" {
//thats what i want to do
self.readyForLogin = true
self.performSegueWithIdentifier("segueLoginToMainPage", sender: self)
}
}
}}
}
return readyForLogin
}
我正在努力学习 Swift,我想做的是创建简单的登录页面。每当用户单击登录按钮时,我都会在 shouldPerformSegueWithIdentifier 中向我的 Web 服务发出请求,以检查用户名和密码是否正确。我不想使用 IBAction(如 touchupinside 等)。解析来自 Web 服务的响应后,我检查是否有任何错误来自 Web 服务响应(例如用户名无效)。如果有任何错误,我想通过 returning false 来防止 segue。但是我不能在 Alamofire 中 return false。那我应该怎么处理呢?这是我的代码:
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLoginToMainPage" {
//...
//Checking if text fields are filled or not
else {
let callURL : String = CONFIG.BASE_URL + "user/login"
let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text,
HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text]
Alamofire.request(.POST, callURL, parameters: parameters)
.responseJSON { (_,_,JSON,_) in
var returnedData = JSON as NSDictionary
if returnedData["status"] as String == "error" {
//thats what i want to do
return false
}
}
}
}
return true
}
但是我不能做 return false 因为它是异步的。我在 Whosebug 中发现了一些类似的问题,但答案并不是我想要的。谢谢!
您根本不应该尝试在 shouldPerformSegueWithIdentifier
中使用异步方法。相反,你应该:
从登录按钮本身删除 segue。
在视图控制器本身之间添加 segue。具体来说,control-从原始场景的视图控制器图标拖动(在 Xcode 6+ 中,此图标位于场景上方的栏中,在早期版本中 Xcode, 这个图标在场景下方的栏中) 到目标场景。
给这个新的segue一个"storyboard identifier".
将登录按钮连接到
IBAction
函数。在那个
IBAction
函数中,执行您的异步网络请求,如果登录成功,则以编程方式performSegueWithIdentifier
,提供您在步骤 3 中指定的故事板标识符.
我认为在这种情况下不使用 IBAction 是一个很好的解决方案,但无论如何有一个解决方法可以实现您的目标。对于此解决方法,您需要声明一个类型为布尔值的变量来检查用户是否准备好登录。您的 shouldPerformSegueWithIdentifier 方法应该始终 return 该变量的值,但在您发出请求之后。最后在您的异步请求完成后调用 prepareForSegue 方法
var readyForLogin = false
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLoginToMainPage" {
//...
//Checking if text fields are filled or not
else {
if(!readyForLogin){
let callURL : String = CONFIG.BASE_URL + "user/login"
let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text,
HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text]
Alamofire.request(.POST, callURL, parameters: parameters)
.responseJSON { (_,_,JSON,_) in
var returnedData = JSON as NSDictionary
if returnedData["status"] as String != "error" {
//thats what i want to do
self.readyForLogin = true
self.performSegueWithIdentifier("segueLoginToMainPage", sender: self)
}
}
}}
}
return readyForLogin
}