2016-09-21 59 views
0

我想提一下,我已经看到很多类似的问题,并尝试从那里的代码,但仍然是我的代码异步运行(我仅在第二次点击后才移动到另一个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值?非常感谢!

+1

如果你读过类似的问题,那么你肯定见过,他们都说你需要为你的方法添加一个完成处理程序并在其中执行你的segue。你尝试过吗? – dan

+0

@dan Yep,感谢Santosh,现在我知道如何使用它了。 对不起,只需几个星期的iOS编程:) – Robert

回答

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 
    } 
    } 
} 
+0

非常感谢Santosh!它工作完美! 我刚刚在performSegueWithIdentifier之前添加了自我。举手击掌! – Robert

+0

很高兴帮助你!投票并将其标记为答案! – Santosh

+0

我的声望太低,但我已经标记了你的答案。再次感谢! – Robert