Swift 第二次调用函数时未调用完成处理程序

Swift Completion Handler Not Called on Second Call to Function

我有一个带有完成处理程序的 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() 必须再次调用,完成处理程序会以某种方式失效并且永远不会 returns 到我原来的 myMainFunction().

有什么想法吗?

如果 offset 不为空,则传递的是空闭包。您需要再次将完成参数转发给 getTasks。试试这个。

//...
if !offset.isEmpty {
    getTasks(project: project, paginationToken: offset, completion: completion)
}
//...