2016-08-20 5 views
-1

私はboolを返す単純なログインメソッドを持っていますが、ユーザログインの成功に依存します。私は応答の順序とコードの実行に問題があります。私は完了ハンドラについて読んだことがありますが、これは私の問題に対する解決策だと思いますが、わかりません。ここに私の方法です:POSTリクエスト付き補完ハンドラ

variable loggedInをチェックするif文がtrueと等しいかどうかを確認するためにsuccess変数を返したいと思います。しかし、その場合、私はエラーになります。

私はこの方法を作った。問題は、メソッドがPOST要求が完了したときよりも速く変数の成功を返すことです。したがって、すべての場合において偽となるでしょう。変数を出力してコードの実行順序を確認し、メソッドはまず "classOUT"を出力し、変数を返し、変数値を設定して "classIN"を出力します。

変数の成功の正しい価値を得るために、ユーザーをログに記録するコードが実行されるまでどのように待機できますか?

+1

それを呼び出すことができます - :あなたは、それは次のようになり呼び出す

func login(username: String, password:String,completionBlock : ((success : Bool)->Void)){ //sending inputs to server and receiving info from server let postRequest = postDataToURL() postRequest.link = "http://pnc.hr/rfid/login.php" postRequest.postVariables = "username=" + username + "&password=" + password postRequest.forData("POST") { jsonString in // getting the result from the asinhronys task let result = convertStringToDictionary(jsonString as String) if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true { let userType = result?["userType"] as? String let token = result?["token"] as? String //if user is logged - setting parameters in Key Chains and redirecting them to the menu view let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(loggedIn, forKey: "loggedIn") defaults.setObject(username, forKey: "username") defaults.setObject(userType, forKey: "userType") defaults.setObject(token, forKey: "token") completionBlock(success:true) } else { completionBlock(success:false) } } } 

の最も頻繁に答えられ、質問されたiOSに関する質問スタックオーバーフロー。尋ねる前に検索してください。 「非同期」のような用語で検索します。非同期関数に依存するものを返すことはできません。なぜなら、関数は返された後に起こるからです。 – matt

答えて

0

はnsuserdefaultsを設定し、ブール結果

completionBlock:を返すにユーザログインを実行しますが、任意のブロックのようにそれを呼び出すときに実行しまいますそのブロックはあるが、あなたは、そのブロックを通じて何すべてを渡す際に選択してもらいます。

login(username: String, password:String,completionBlock : { (success) in 
    print(success) 
    }) 
+0

完了ブロックとは何ですか?このように定義されているfuncを呼び出す方法は? –

+0

はコードを更新しました:) – Dravidian

+1

あなたの関数の基本的に別のパラメータです。良いことはそれも関数です – ha100

0

あなたはこの

func login(username: String, password: String, completion: (Bool) ->()) { 


    ... YOUR USUAL NETWORKING CODE ... 


    completion(success) 

} 

ような何かをして、これは

login(username: anonymous, password: ******) { authStatus in 

    if authStatus == true { 
     print("user in") 
    } else { 
     print("try one more time") 
    } 

} 
関連する問題