如何解决如何更改触发功能的顺序?
我正在研究Swift编码,对我的代码有疑问。
在下面的代码中,我试图首先获取表视图单元格的信息,然后执行segue。我还使用Firestore保存数据。问题是当我使用打印时,我可以先看到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)
}
}
}
}
}
}
另请参阅:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。