【问题标题】:Alamofire async call [duplicate]Alamofire异步调用[重复]
【发布时间】:2017-04-18 05:29:49
【问题描述】:

我有一个简单的问题。我正在连接到我的 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"
    }

}

【问题讨论】:

  • 你为什么认为它没有执行那个函数,你有没有在那个函数中设置断点并尝试调试它?
  • 同意尼拉夫。我假设您在 switch 语句中调用 self.loginSuccess 时遇到问题。你确定status 是在上面的可选绑定中设置的吗?
  • 是的,我已经检查过它是否调用了 self.loginSuccess 但 self.result 永远不会改变
  • 你在哪里查看self.loginSuccess
  • 您能否向我们展示您检查self.result 值的代码?

标签: ios swift3 alamofire


【解决方案1】:

您需要在 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。

【讨论】:

  • 非常感谢,这真的很有帮助
  • @TarekAdel 欢迎朋友 :)
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 2018-09-05
  • 2022-07-25
  • 1970-01-01
  • 2020-05-07
  • 2016-08-20
  • 2016-08-19
  • 2018-09-22
相关资源
最近更新 更多