swift - 如何更改触发功能的顺序?
问题描述
我正在编写 Swift 编码并且在我的代码中有问题。在下面的代码中,我试图先获取表格视图单元格的信息,然后执行 segue。我也在使用 Firestore 来保存数据。问题是当我使用 print 时,我可以segue triggered!!!
先看到然后document saved!!
. 由于我想将 , 的值传递doc.documentID
给下一个视图控制器,因此我想在触发执行 segue 之前保存 documentID .....
class HomeViewController: UIViewController {
var gameDocumentID = ""
// more codes here...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.homeToGameScreen {
let gameScreenVC = segue.destination as! GameScreenViewController
gameScreenVC.gameDocumentID = gameDocumentID
}
}
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// serch game db where player1 is ready to play
db.collection(K.FStore.newGameCpllection).whereField(K.FStore.uID, isEqualTo: players[indexPath.row].uID).addSnapshotListener { (querySnapshot, err) in
if let err = err {
print("Error getting game db: \(err)")
} else {
for doc in querySnapshot!.documents {
print("document saved!!")
self.gameDocumentID = doc.documentID
self.db.collection(K.FStore.newGameCpllection).document(self.gameDocumentID).updateData([
K.FStore.player2Field: self.playerInfo[K.FStore.nameField]!
]) { err in
if let err = err {
print("Error updating document: \(err)")
} else {
print("Document successfully updated")
}
print("segue triggered!!!")
self.performSegue(withIdentifier: K.homeToGameScreen, sender: self)
}
}
}
}
}
}
解决方案
数据从 Firebase 异步加载。由于这可能需要一些时间,因此您的完成处理程序的调用时间比您预期的要晚。
出于这个原因,任何需要数据库数据的代码都需要在完成处理程序中,或者从那里调用。
所以最简单的解决方法是将 移动performSegue
到回调中:
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
db.collection(K.FStore.newGameCpllection)
.whereField(K.FStore.uID, isEqualTo:players[indexPath.row].uID)
.addSnapshotListener { (querySnapshot, err) in
if let err = err {
print("Error getting game db: \(err)")
} else {
for doc in querySnapshot!.documents {
print("document saved!!")
self.gameDocumentID = doc.documentID
self.db.collection(K.FStore.newGameCpllection).document(self.gameDocumentID).updateData([
K.FStore.player2Field: self.playerInfo[K.FStore.nameField]!
]) { err in
if let err = err {
print("Error updating document: \(err)")
} else {
print("Document successfully updated")
}
print("segue triggered!!!")
self.performSegue(withIdentifier: K.homeToGameScreen, sender: self)
}
}
}
}
}
}
另见:
推荐阅读
- django - Django 中 urls.py 中 app_name 的用途是什么?
- javascript - 隐藏父菜单并显示子菜单
- python - 有没有办法根据输入的文件类型将 psv、csv 或 excel 文件读入数据框?
- vb.net - 如何在变量中存储一个大数字
- node.js - 如何处理目标 firestore.googleapis.com:443 代码的名称解析失败:14
- python - 出现次数的数组
- angular - clrDgSingleSelected 在清晰版本 3 中抛出错误
- macos - 如何调试调用 NSMenuItem 上的 undo 命令导致的崩溃?
- sas - SAS:在数据步中添加字符变量而不预先设置长度
- node.js - NodeJS/Express 多个路由文件之间的共享功能