[英]How can I change the order of functions triggered?
我正在處理 Swift 編碼,我的代碼有問題。 在下面的代碼中,我試圖先獲取表格視圖單元格的信息,然后再執行 segue。 我也在使用 Firestore 來保存數據。 問題是當我使用 print 時,我可以看到segue triggered!!!
先document saved!!
. 因為我想將doc.documentID
的值傳遞給下一個視圖 controller,所以我想在執行 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)
}
}
}
}
}
}
另見:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.