从 tableView 中选择项目时触发另一个函数后执行函数

Posted

技术标签:

【中文标题】从 tableView 中选择项目时触发另一个函数后执行函数【英文标题】:Execute function after another function is triggered when selecting an item from a 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函数的定义会有所帮助 【参考方案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()
   

希望对您有所帮助!

【讨论】:

以上是关于从 tableView 中选择项目时触发另一个函数后执行函数的主要内容,如果未能解决你的问题,请参考以下文章

从当前模态的委托中呈现 UIAlertView

如何从另一个函数触发选择事件 [SAPUI5]

TableView:如何从 didSelectRowAtIndexPath 例程中选择另一行的值

从 tableview 中选择时在多个详细视图之间切换

滚动到另一个时 TableView 折叠单元格:奇怪的行为

tableview 不会从第二类正确重新加载