Обработчик быстрого завершения не вызывается при втором вызове функции

У меня есть функция Swift с обработчиком завершения, которую я хочу вызвать при выполнении определенного сетевого запроса. Сетевой запрос может быть повторен в зависимости от того, сообщается ли ответ сервера о наличии дополнительных данных (предоставлено offset).

Изначально я назвал это так:

func myMainFunction(){
  getTasks(project: project, paginationToken: nil) {
    print("This never fires...")
  }
}

И моя функция getTasks() такая:

func getTasks(project: Project, paginationToken: String?, completion: @escaping () -> Void){
  var url = "..."
  if let token = paginationToken{
    url += "&offset=\(token)"
  }

  Alamofire.request(url).responseJSON { response in  
    switch response.result {

    case .success(let value):
      let json = JSON(value)
      //...
      //Check for pagination
      let offset = json["next_page"]["offset"].stringValue
      if !offset.isEmpty{
        //Theres a pagination token available, go again!
        getTasks(project: project, paginationToken: offset){}
      }else{
        print("This prints to the log on the last run through")
        completion()
      }

    case .failure(let error):
      print("Task error: \(error)")
    }
  }
}

Если offset никогда не бывает, то обработчик completion() работает нормально. Но если getTasks() нужно вызвать снова, обработчик завершения каким-то образом становится недействительным и никогда не возвращается к моему исходному myMainFunction().

Любые идеи?


person Clifton Labrum    schedule 28.11.2017    source источник


Ответы (1)


Вы передаете пустое закрытие, если смещение не пусто. Вам нужно снова передать параметр завершения в getTasks. Попробуй это.

//...
if !offset.isEmpty {
    getTasks(project: project, paginationToken: offset, completion: completion)
}
//...
person Bilal    schedule 28.11.2017
comment
О, я вижу. По сути, он отслеживает исходный обработчик завершения. Я удалял его, передавая пустое значение при последующих вызовах функций. Имеет смысл. Спасибо! :) - person Clifton Labrum; 28.11.2017