如何将代码执行移动到主要的qeue

时间:2016-09-21 19:45:39

标签: ios swift asynchronous nsurlsession synchronous

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

1 个答案:

答案 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
    }
  }
}