从tableView选择项目时触发另一个功能后执行功能

时间:2019-04-30 12:24:22

标签: swift func completionhandler

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

下面是我的代码段:

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

谢谢。

4 个答案:

答案 0 :(得分:1)

由于fetchChosenExerciseData是异步的,因此您需要此结构

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

致电

fetchChosenExerciseData { 
    goToSegue()
}

答案 1 :(得分:0)

使用完成处理程序可以轻松实现:

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

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

fetchChosenExerciseData {
    // goToSegue
}

答案 2 :(得分:0)

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

对于这种情况,应使用完成块。 因此,您必须像这样声明“ fetchChosenExerciseData”

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

我已经读过您已经完成了此解决方案,但是我相信那一定有一些错误

答案 3 :(得分:0)

首先将完成框添加到方法fetchChosenExerciseData中,例如

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()
   }
}

希望获得帮助!