从 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 中选择项目时触发另一个函数后执行函数的主要内容,如果未能解决你的问题,请参考以下文章