简体   繁体   中英

How to write alamofire request function that returns the response?

I am writing a function to call a POST request using AlamoFire. I am passing URL and parameters. I need to return the response of the Alamofire request.

This is my code:

func callAPI(params: Dictionary<String, Any>, url: String) -> Void {
    let hud = MBProgressHUD.showAdded(to: self.view, animated: true)
    hud.contentColor = UIColor.red
    DispatchQueue.global().async {
        Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding(options: []), headers: nil).responseJSON { response in
            DispatchQueue.main.async {
                hud.hide(animated: true)
                switch response.result{
                case .success:
                    if let resultJson = response.result.value as? Dictionary<String,Any>{
                        print(resultJson)
                        // Success
                    }
                case .failure(let error):
                    print(error)
                    //Failed
                }
            }
        }
    }
}

I want to return the response dictionary resultJson from this function. And I want to reuse this function for all API calls.

How can I rewrite this function to get the solution?

You can pass a closure as a parameter to the function like this

func callAPI(params: Dictionary<String, Any>, url: String, completion:@escaping (((Dictionary<String,Any>?) -> Void))) -> Void {
    let hud = MBProgressHUD.showAdded(to: self.view, animated: true)
    hud.contentColor = UIColor.red
    Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding(options: []), headers: nil).responseJSON { response in
        hud.hide(animated: true)
        switch response.result{
        case .success:
            if let resultJson = response.result.value as? Dictionary<String,Any>{
                print(resultJson)
                completion(resultJson)
                // Success
            }
        case .failure(let error):
            print(error)
            completion(nil)
            //Failed
        }
    }
}

Call the function with the closure

callAPI(params: [:], url: "") { resultJson in
    guard let resultJson = resultJson else {
        return
    }
    print(resultJson)
}

You should pass the clouser parameter. After that when success execute completion(resultJson, nil) if server result error you should execute completion(nil, error.localizedDescription)

func callAPI(params: Dictionary<String, Any>, url: String , completion: @escaping (Dictionary<String,Any>?, String?) -> ()) -> Void { }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM