Alamofire请求不会返回

时间:2017-11-06 21:36:26

标签: ios swift request alamofire

我想创建一个带有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.
}

}

1 个答案:

答案 0 :(得分:1)

Alamofire功能是异步的,因为它是一个网络请求。这意味着函数在返回来自网络请求的数据之前返回,因此它总是返回nil,因为jsonObject在被修改之前返回。你需要做的是传递一个回调函数作为参数,以便在Alamofire函数返回时调用回调函数体。

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