如何使用完成处理程序和参数调用函数

时间:2018-10-05 12:24:45

标签: swift alamofire

我有一个函数getData(completed: @escaping ()->()),它在一个类中使用完成处理程序创建了 alamofire 请求。当alamofire结束其工作时,在此函数内部,我调用completed()通知该函数结束了其工作。点击按钮后,在其他viewcontroller中调用此函数,但没有完成处理程序,然后在此调用内,使用下载的数据重新加载tableview,如下所示。

现在,我想向此功能添加其他参数,以允许用户修改alamofire请求的URL,并获得自定义响应。参数将在其他文本字段中设置。但是现在当我调用downloadRepositories()时,我不能忽略调用完成参数。

  

我该如何避免在其中或其他操作中调用完成处理程序   我应该实施完成处理程序吗?

当前的alamofire请求

 class DataClass {

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

 }

及其实现

class OtherVC {

  var dataClass = DataClass()

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

我想做什么

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()  
  }

修改后的功能的实现

 class OtherVC {

  var dataClass = DataClass()

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

我当然知道不可能像这样在func调用中传递参数,但是该怎么做呢?

2 个答案:

答案 0 :(得分:0)

像这样使用:

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

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

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

答案 1 :(得分:0)

您在正确的轨道上) 如果要这样调用func:

dataclass.getData(parameter1: someTextField.text, parameter2: someTextField2.text){
      self.TableView.reloadData()
  }

您只需要这样的更改参数顺序:

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

如果我理解正确,并且您想使用Trailing Closures,那就够了