如何将代码执行移动到主要代码
问题描述:
我想提一下,我已经看到很多类似的问题,并尝试从那里的代码,但仍然是我的代码异步运行(我仅在第二次点击后才移动到另一个ViewController在登录按钮。这就是为什么我将非常感谢您指出我的代码的问题,而不是引用我给别人的人。如何将代码执行移动到主要代码
我有端发送数据到服务器
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值?非常感谢!
答
而不是你的全局变量,练习使用完成处理程序。在此你的情况,你可以使用这样的:
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
}
}
}
如果你读过类似的问题,那么你肯定见过,他们都说你需要为你的方法添加一个完成处理程序并在其中执行你的segue。你尝试过吗? – dan
@dan Yep,感谢Santosh,现在我知道如何使用它了。 对不起,只需几个星期的iOS编程:) – Robert