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

Posted

技术标签:

【中文标题】第二次调用函数时未调用 Swift 完成处理程序【英文标题】:Swift Completion Handler Not Called on Second Call to Function 【发布时间】: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()

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

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

//...

【讨论】:

哦,我明白了。所以本质上它是在跟踪原始的完成处理程序。我通过在后续函数调用中传递一个空白值来删除它。说得通。谢谢! :)

以上是关于第二次调用函数时未调用 Swift 完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

SKScene touchesEnded 第二次呈现场景时未调用

为啥我的完成处理程序永远不会被调用?

从 Timer 选择器函数 Swift 调用函数的完成处理程序

进行第二次 Json 调用 Swift 3 后如何在 UITableview 中重新加载数据

从 Java Script (TVML) 调用带有完成处理程序的 Swift 函数

Swift:如何调用其中一个参数是完成处理程序的函数