【问题标题】:Alamofire request doesn't returnAlamofire 请求不返回
【发布时间】:2018-04-19 03:56:51
【问题描述】:

我想创建一个带有 textField 和标签的应用程序。 textField 将读取输入并使用 Alamofire 检查输入是否存在。 (url 将返回 JSON Bool。)一个名为 getReturnVal 的辅助函数用于从 url 中获取返回值。

但是,nameExist 变量始终为 nil,并且辅助函数似乎从不涉及这两种情况。请告知我应该如何解决这个问题。

提前谢谢你。

我的代码如下。

导入 UIKit

导入 Alamofire

类 ViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var nameField: UITextField!

@IBOutlet weak var nameLabel: UILabel!
var nameValid: Bool = false

func textFieldDidEndEditing(_ textField: UITextField) {
    if textField == nameField {
        guard let username = textField.text, !username.isEmpty else {
            nameValid = false
            return
        }
        let url = "https://bismarck.sdsu.edu/hometown/nicknameexists?name=" + username
        print(url)
        let nameExist = getReturnVal(url: url, type: Bool.self)
        if nameExist! {
            nameLabel.text = "Exist"
            nameValid = false
        } else {
            nameLabel.text = "Valid"
            nameValid = true
        }

    }

}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

func getReturnVal<T>(url: String, type: T.Type) -> T? {
    var jsonObject: T?
    print("enter------------")
    Alamofire.request(url).validate().responseJSON { response in
        switch response.result {
        case .success:
            if let JSON = response.result.value {
                jsonObject = (JSON as! T)
                print("SUCCESS--------")
                print("JSON: \(String(describing: jsonObject))")

            }
        case .failure(let error):
            print("--------------")
            print(error)
            jsonObject = false
        }
    }
    return jsonObject
}

override func viewDidLoad() {
    super.viewDidLoad()
    nameField.delegate = self
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

【问题讨论】:

    标签: ios swift request alamofire


    【解决方案1】:

    Alamofire 函数是异步的,因为它是一个网络请求。这意味着该函数在网络请求的数据返回之前返回,所以它总是会返回 nil,因为 jsonObject 在它被修改之前就返回了。您需要做的是传入一个回调函数作为参数,以便在 Alamofire 函数返回时调用回调函数体。

    回调签名可能是这样的: callback: (T) -&gt; () 然后在 getReturnVal 函数中,您可以在设置变量 jsonObject 之后立即调用callback(jsonObject)(所以两次)。然后,当您调用 getReturnVal 时,您需要传入一个函数,该函数将 jsonObject 作为参数。

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 2018-04-29
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多