我想创建一个带有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.
}
}
答案 0 :(得分:1)
Alamofire功能是异步的,因为它是一个网络请求。这意味着函数在返回来自网络请求的数据之前返回,因此它总是返回nil,因为jsonObject在被修改之前返回。你需要做的是传递一个回调函数作为参数,以便在Alamofire函数返回时调用回调函数体。
回调签名可能是这样的:
callback: (T) -> ()
然后在getReturnVal函数内部,您可以在设置变量jsonObject之后立即调用callback(jsonObject)
(这样两次)。然后当你调用getReturnVal时,你需要传入一个函数,该函数将jsonObject作为参数。