【问题标题】:How to call function with completion handler and parameters如何使用完成处理程序和参数调用函数
【发布时间】:2024-01-08 07:52:01
【问题描述】:

我有一个函数 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 调用中传递参数是不可能的,但是怎么能这样呢?

【问题讨论】:

    标签: swift alamofire


    【解决方案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,那么就是这样

    【讨论】:

      最近更新 更多