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

Posted

技术标签:

【中文标题】如何使用完成处理程序和参数调用函数【英文标题】:How to call function with completion handler and parameters 【发布时间】:2018-10-05 12:24:45 【问题描述】:

我有一个函数 getData(completed: @escaping ()->()),它在一个类中创建带有完成处理程序的 alamofire 请求。当 alamofire 结束它的工作时,在这个函数内部我调用completed() 来通知该函数结束了它的工作。此函数在按钮点击后在其他视图控制器中调用,但没有完成处理程序,然后在此调用中我使用下载的数据重新加载 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()  
  

修改后func的实现

 class OtherVC 

  var dataClass = DataClass()

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

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

【问题讨论】:

【参考方案1】:

这样使用:

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

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

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

【讨论】:

如何在这个函数中传递一个json数组? 你说的json数组是什么意思?【参考方案2】:

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

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

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

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

如果我理解正确并且你想使用Trailing Closures,那么就是这样

【讨论】:

以上是关于如何使用完成处理程序和参数调用函数的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何调用其中一个参数是完成处理程序的函数

如何在 Swift 中使用完成处理程序链接函数?

如何使用带参数的函数作为事件处理程序?

我如何使用参数调用回调函数?

如何存储闭包完成处理程序以供以后调用?

为链式函数使用 Swift 完成处理程序