2016-12-03 74 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

@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

您需要使用完成處理器與login方法,因爲它正在一個異步調用,因此使一個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響應也然後進行完成處理程序有兩個參數布爾和解釋,並通過JSON這一點。

+0

非常感謝,這真的幫助 –

+0

@TarekAdel歡迎伴侶:) –