2016-12-03 25 views
1

私は簡単な問題があります。 RESTfulなサーバーに接続して接続しようとしています。私は応答を取得し、すべてが完璧に動作しますが、変数を設定する関数を呼び出そうとすると、変数が呼び出されません。Alamofire非同期呼び出し

コード:

// 
// LoginClass.swift 
// LoginApp 
// 
// Created by Tarek Adel on 12/3/16. 
// Copyright © 2016 Tarek Adel. All rights reserved. 
// 

import Foundation 
import Alamofire; 
import UIKit; 

class LoginClass { 
    var result: Bool = false; 

    var username: String 
    var password: String 

    init(username: String, password:String) { 
     self.username = username; 
     self.password = password; 
    } 


    func login() -> Void { 
     let data = [ 
      "grant_type" : "password", 
      "username" : self.username, 
      "password" : self.password, 
      "client_secret":"xxxxxx", 
      "client_id":"xxxxxx", 
      "scope": "" 
     ] 
     Alamofire.request("http://localhost:8000/oauth/token", method: .post, parameters: data) 
      .responseJSON { response in 

       //to get status code 
       if let status = response.response?.statusCode { 
        switch(status){ 
        case 200: 
         self.loginSuccess(); 
        default: 
         print("error with response status: \(status)") 
        } 
       } 
       //to get JSON return value 

       if let result = response.result.value { 
        let JSON = result as! NSDictionary 
        print(JSON) 
       } 

     } 
    } 

    func loginSuccess() { 
     self.result = true; 
    } 

} 

私はself.resultをチェックする場所です:あなたはそれが非同期呼び出しを行っているので、あなたのlogin方法で完了ハンドラを使用し、そのようにする必要があり

@IBAction func loginButton(_ sender: UIButton) { 
    let username = usernameTextField.text!; 
    let password = passwordTextField.text!; 

    let loginClass = LoginClass(username: username, password:password) 
    loginClass.login() 

    if(loginClass.result == true) { 
     resultLabel.text = "Correct!" 
    } else { 
     resultLabel.text = "Wrong Credentials" 
    } 

} 
+0

なぜあなたはその関数を実行していないと思いますか?その関数の中にブレークポイントを入れてデバッグしようとしましたか? –

+0

Niravとの合意。 switch文の中で 'self.loginSuccess'を呼び出すのに問題があると仮定しています。上記のオプションのバインドで 'status'が設定されていることを確かめますか? –

+0

はい、私はそれがself.loginSuccessを呼び出すことを確認しましたが、self.resultは決して変更されません。 –

答えて

3

あなたのログイン方法でcompletionHandlerを実行し、その中の条件がcompletionHandlerの場合に実行します。

func login(completionHandler: (_ result: Bool) ->()) { 
    let data = [ 
     "grant_type" : "password", 
     "username" : self.username, 
     "password" : self.password, 
     "client_secret":"xxxxxx", 
     "client_id":"xxxxxx", 
     "scope": "" 
    ] 
    Alamofire.request("http://localhost:8000/oauth/token", method: .post, parameters: data) 
     .responseJSON { response in 

      //to get status code 
      if let status = response.response?.statusCode { 
       switch(status){ 
       case 200: 
        //to get JSON return value 
        if let result = response.result.value { 
         let JSON = result as! NSDictionary 
         print(JSON) 
        } 
        completionHandler(true) 
       default: 
        print("error with response status: \(status)") 
        completionHandler(false) 
       } 
      }     
    } 
} 

このようにこのログインメソッドを呼び出します。

self.login { (result) in 
    if(result) 
    { 
     resultLabel.text = "Correct!" 
    } 
    else{ 
     resultLabel.text = "Wrong Credentials" 
    } 
} 

注:あなたはJSONレスポンスをしたい場合も、2つのパラメータブールと辞書で完了ハンドラを作成し、それにもJSONを渡します。

+0

ありがとう、これは本当に助けた –

+0

@TarekAdelようこそメイト:) –

関連する問題