Как вызвать функцию с обработчиком завершения и параметрами - PullRequest
0 голосов
/ 05 октября 2018

У меня есть func getData(completed: @escaping ()->()), который создает alamofire запрос с обработчиком завершения в одном классе.Когда alamofire завершает свою работу, внутри этой функции я вызываю completed(), чтобы уведомить эту функцию о завершении своей работы.Эта функция вызывается в другом viewcontroller после нажатия кнопки, но без обработчика завершения, а затем внутри этого вызова я перезагружаю таблицу с загруженными данными, как показано ниже.

Теперь я хочу добавить к этому параметру дополнительные параметры, чтобы пользователь мог изменить URL запроса alamofire и получить пользовательский ответ.Параметры будут установлены в других текстовых полях.Но теперь, когда я вызываю 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 голосов
/ 05 октября 2018

Вы на правильном пути) Если вы хотите вызвать func следующим образом:

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

Вам просто нужно изменить порядок параметров следующим образом:

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

Если я правильно понимаю иВы хотите использовать Trailing Closures , тогда это все

0 голосов
/ 05 октября 2018

Используйте вот так:

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

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

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