我想提一下,我已经看过很多类似的问题,并从那里尝试了代码,但我的代码仍然是异步运行的(只有在第二次点击LogIn Button后才移动到另一个ViewController。这就是为什么我真的会感谢你在我的代码中指出问题,而不是将我引用给别人。
我有一个将logIn数据发送到服务器的方法
import UIKit
var IS_LOGGED_IN = Bool()
class LoginDataSender: UIView {
func sendLogInData() {
let myUrl = NSURL(string: "https://somewebsite")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let postString = "username=NAME&password=PASS"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, respoonse, error) in
if error != nil
{
print("error=\(error)")
return
}
dispatch_async(dispatch_get_main_queue(), {
do {
let myJson = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
IS_LOGGED_IN = myJson.valueForKey("status") as! Bool
print(IS_LOGGED_IN)
} catch {
print(error)
}
})
}.resume()
}
}
我从ViewController
调用此方法import UIKit
class LoginViewController: UIViewController {
let logInDataSender = LoginDataSender()
@IBAction func pressLoginButton(sender: AnyObject) {
logInDataSender.sendLogInData()
if IS_LOGGED_IN {
performSegueWithIdentifier("LogInSegue", sender: self)
}
}
如您所见,我将结果结果存储在全局变量IS_LOGGED_IN中,并基于此我是否执行segue。 现在我只是硬编码登录/密码用于测试目的。
第一次单击“登录”按钮时,我应该在哪里放置dispatch_async以使用IS_LOGGED_IN值?非常感谢!
答案 0 :(得分:0)
使用完成处理程序,而不是全局变量。在这种情况下,您可以使用:
func sendLogInData(completionhandler: (Bool)->()) {
//.......
dispatch_async(dispatch_get_main_queue(), {
do {
let myJson = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
completionhandler(myJson.valueForKey("status") as! Bool)
} catch {
completionhandler(false)
print(error)
}
})
//.....
}
然后在LoginViewController
的行动方法中
@IBAction func pressLoginButton(sender: AnyObject) {
logInDataSender.sendLogInData { (loggedIn) in
if loggedIn == true {
//Logged In
performSegueWithIdentifier("LogInSegue", sender: self)
}else{
//Not logged in
}
}
}