2016-09-21 22 views
0

私は多くの類似の質問を見て、そこからコードを試したが、私のコードは非同期で実行されることを言及したいと思います(別のViewControllerに移動するのは、ログインボタンの。私はあなたが誰かの他に私を参照するというし、私のコードで問題を指摘、本当に感謝する理由。コード実行をメインqeueに移動する方法

私は、サーバー

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を実行するかどうかを判断します。 今のところ私はテスト目的でログイン/パスワードをハードコードしています。

LogInボタンを初めてクリックしたときに、IS_LOGGED_IN値を使用できるようにするにはどこにdispatch_asyncを配置する必要がありますか?どうもありがとう!

+1

あなたが同様の質問を読んだなら、きっとあなたは彼らのすべてがあなたの言うことを見てきましたあなたのメソッドに補完ハンドラを追加し、その内部であなたのセグを実行する必要があります。あなたはそれを試しましたか? – dan

+0

@ダン今、Santoshのおかげで、私はその使い方を知っています。 申し訳ありません、iOS用のプログラミングは数週間です:) – Robert

答えて

0

グローバル変数の代わりに、完了ハンドラを使用するようにしてください。

LoginViewControllerのアクションメソッドで
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) 
      } 
     }) 
    //..... 
} 

そして:これはあなたのケースでは、あなたは次のように使用することができます

@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

関連する問題