Search code examples
swiftalamofire

How to call function with completion handler and parameters


I have a func getData(completed: @escaping ()->()) that creates alamofire request with completion handler in one class. When alamofire ends it job, inside of this function i call completed() to notify that function ended its work. This func is called in other viewcontroller after button tap, but without completion handler, and then inside of this call i reload tableview with downloaded data as below.

Now i want to add to this func additional parameters to allow user modify URL of alamofire request, and get custom response. Parameters will be setted in other textfields. But now when i call downloadRepositories() i can't omit calling completion parameter.

How can i avoid calling completion handler in it or what other completion handler should i implement?

Current alamofire request

 class DataClass {

   func getData(completed: @escaping () -> ()){
   //alamofire request
   Alamofire.request(url).responseJSON{
   //reponse
   completed()
   }

 }

And it's implementation

class OtherVC {

  var dataClass = DataClass()

  @objc func searchBtnTapped(sender: UIButton!){      
      dataclass.getData(){
          self.TableView.reloadData()
      }
  }
}

What i would like to do

class DataClass {

  func downloadRepositories(completed: @escaping () -> (), parameter1: String, parameter2: String) {

  let parameters: Parameters = [ "parameterA": parameter, "parameterB": parameter2 ]

  Alamofire.request(url, parameters: parameters).responseJSON{
      //response
      completed()  
  }

Implementation of modified func

 class OtherVC {

  var dataClass = DataClass()

  @objc func searchBtnTapped(sender: UIButton!){      
      dataclass.getData(parameter1: someTextField.text, parameter2: someTextField2.text){
          self.TableView.reloadData()
      }
   }
 }

Of course I know that is not possible to pass parameters in func call like this, but how can do this other way?


Solution

  • Use like this:

    func downloadRepositories(parameter1: String, parameter2: String, completed: @escaping () -> ()) {
    
    let parameters: Parameters = [ "parameterA": parameter, "parameterB": parameter2 ]
    
    Alamofire.request(url, parameters: parameters).responseJSON {
      //response
      completed()  
    }