Ios 阿拉莫菲尔异步调用

Ios 阿拉莫菲尔异步调用,ios,swift3,alamofire,Ios,Swift3,Alamofire,我有一个简单的问题。我正在连接我的RESTful服务器并尝试连接。我得到了一个响应,一切都很完美,但是当我试图调用一个函数来设置一个变量时,它就是不调用它 代码: // // LoginClass.swift // LoginApp // // Created by Tarek Adel on 12/3/16. // Copyright © 2016 Tarek Adel. All rights reserved. // import Foundation import Alamofi

我有一个简单的问题。我正在连接我的RESTful服务器并尝试连接。我得到了一个响应,一切都很完美,但是当我试图调用一个函数来设置一个变量时,它就是不调用它

代码:

//
//  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"
    }

}

您需要将完成处理程序与您的
login
方法一起使用,因为它正在进行异步调用,所以请使用您的登录方法创建一个
completionHandler
,然后在该
completionHandler
中执行该if条件

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响应,则使用两个参数Bool和Dictionary生成完成处理程序,并使用该参数传递JSON

您需要将完成处理程序与您的
login
方法一起使用,因为它正在进行异步调用,所以请使用您的login方法创建一个
completionHandler
,然后在该
completionHandler
中执行if条件

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响应,则使用两个参数Bool和Dictionary生成完成处理程序,并使用该参数传递JSON

为什么你们认为它并没有执行那个函数,你们把断点放在那个函数里面并试着调试它?同意Nirav。我假设您在switch语句中调用
self.loginsucess
时遇到问题。您确定在上面的可选绑定中设置了
状态吗?是,我已经检查过它是否调用了self.loginsucess,但是self.result从未更改。您在哪里检查
self.loginsucess
?您能告诉我们您的代码在哪里检查
self.result
?为什么您认为它没有执行该函数,您是否已将断点放在该函数中并尝试调试它?同意Nirav。我假设您在switch语句中调用
self.loginsucess
时遇到问题。你确定在上面的可选绑定中设置了
状态吗?是的,我已经检查过它调用self.loginsucess,但是self.result从未更改。你在哪里检查
self.loginsucess
?你能告诉我们你的代码在哪里检查
self.result
?非常感谢,这真的helped@TarekAdel欢迎朋友:)非常感谢,真的helped@TarekAdel欢迎朋友:)