【问题标题】:Execute function after another function is triggered when selecting an item from a tableView从 tableView 中选择项目时触发另一个函数后执行函数
【发布时间】:2019-04-30 12:24:22
【问题描述】:

当在我的 tableView 中选择一个项目时,我希望在第二个函数 goToSegue 被触发之前执行第一个函数 fetchChosenExerciseData。我该如何实施?我看过完成块但无济于事。

我的代码的 sn-p 如下:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell
    exerciseChosen = cell.textLabel!.text!
    duplicatesRemovedFromSetDataList.removeAll()
    fetchChosenExerciseData()
    goToSegue()

提前致谢。

【问题讨论】:

  • 会的。有什么问题?
  • 函数几乎同时执行,因此在触发segue之前还没有检索到数据。
  • 在 fetchChosenExerciseData() 中编写 goToSegue() 函数。如果他们在同一个班级。
  • 或者按照您的建议,使用完成块作为 fetchChosenData() 函数的参数
  • 它们不是同时执行的。 fetchChosenExerciseData 将首先执行,然后是 goToSegue。现在你是否在fetchChosenExerciseData 中调度一些异步任务是另一回事。如果您发布fetchChosenExerciseData函数的定义会有所帮助

标签: swift func completionhandler


【解决方案1】:

由于fetchChosenExerciseData 是异步的,你需要这个结构

func fetchChosenExerciseData(completion:@escaping()->()) {
    Api.load { 
        completion()
    }
}

打电话

fetchChosenExerciseData { 
    goToSegue()
}

【讨论】:

  • 我现在在 ** didSelectRowAt** 中遇到错误,说“缺少参数‘完成’的参数”。这是我插入fetchChosenExerciseData { goToSegue() } 的地方吗?对初学者的问题表示歉意
  • didSelectRowAt 中的代码未更改,但函数已更改。 func fetchChosenExerciseData(completion:@escaping()->()){ //code completion()
【解决方案2】:

使用完成处理程序很容易实现:

func fetchChosenExerciseData(_ completion: @escaping () -> Void) {
     // do what you need
     completion()
}

在您的 didSelectRowAt 中,您可以插入您的第二个函数

fetchChosenExerciseData {
    // goToSegue
}

【讨论】:

    【解决方案3】:

    您的函数fetchChosenExerciseData似乎有一些异步部分或一些正在不同队列上执行的代码。

    对于这样的情况,您应该使用完成块。 所以你必须像这样声明`fetchChosenExerciseData'

    func fetchChosenExerciseData (completion (()->()))
    {
    // Enter your code 
    completion()
    }
    

    我已经读到你已经完成了这个解决方案,但我相信其中一定有一些错误

    【讨论】:

      【解决方案4】:

      首先将完成块添加到您的方法fetchChosenExerciseData like

      func fetchChosenExerciseData(finished: () -> Void) {
           print("Doing something whatever you want!")
           finished()
      }
      

      然后从您的第一个方法的完成块中调用您的函数goToSegue,例如

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell
          exerciseChosen = cell.textLabel!.text!
          duplicatesRemovedFromSetDataList.removeAll()
          fetchChosenExerciseData{
          goToSegue()
         }
      }
      

      希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 2021-08-15
        • 2019-08-01
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多