【问题标题】:Swift Completion Handler Not Called on Second Call to Function第二次调用函数时未调用 Swift 完成处理程序
【发布时间】:2017-11-28 03:39:33
【问题描述】:

我有一个带有完成处理程序的 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()

有什么想法吗?

【问题讨论】:

    标签: swift alamofire completionhandler


    【解决方案1】:

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

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

    【讨论】:

    • 哦,我明白了。所以本质上它是在跟踪原始的完成处理程序。我通过在后续函数调用中传递一个空白值来删除它。说得通。谢谢! :)
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2021-03-18
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多