未添加的孩子我有得到由以下火力数据库填充一个UITableView
观察甚至.childAdded:表视图将继续添加行,而当火力地堡
"games" : {
"user1" : {
"game1" : {
"currentGame" : "yes",
"gameType" : "Solo",
"opponent" : "Computer"
}
}
}
我加载所有的游戏在viewDidLoad
,一用户可以在另一个UIViewController
中创建新游戏,一旦用户这样做并导航回UITableView
我想用新行更新表格。我尝试这样做,用下面的代码:
var firstTimeLoad : Bool = true
override func viewDidLoad() {
super.viewDidLoad()
if let currentUserID = Auth.auth().currentUser?.uid {
let gamesRef =
Database.database().reference().child("games").child(currentUserID)
gamesRef.observe(.childAdded, with: { (snapshot) in
let game = snapshot
self.games.append(game)
self.tableView.reloadData()
})
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if firstTimeLoad {
firstTimeLoad = false
} else {
if let currentUserID = Auth.auth().currentUser?.uid {
let gamesRef = Database.database().reference().child("games").child(currentUserID)
gamesRef.observe(.childAdded, with: { (snapshot) in
self.games.append(snapshot)
self.tableView.reloadData()
})
}
}
}
可以说,有数据基地之一目前的游戏,当viewDidLoad
与一列正常运行表显示。但是,无论何时,当我导航到另一个视图并导航时,viewDidAppear
都会运行,并且出于某种原因,即使未添加任何子项,重复game
似乎也会附加到games
。
细胞被填充由games
阵列:
internal func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
let cell = Bundle.main.loadNibNamed("GameTableViewCell", owner:
self, options: nil)?.first as! GameTableViewCell
let game = games[indexPath.row]
if let gameDict = game.value as? NSDictionary {
cell.OpponentName.text = gameDict["opponent"] as? String
}
return cell
}
UPDATE:
感谢大家的答案!这似乎是我误解了firebase .childAdded的功能,我非常感谢您的所有答案,试图帮助我,我认为对于我的应用程序来说,最简单的方法就是在每次显示视图时拉取所有数据。
当你追加的自我。游戏数组,那么你必须检查self.games数组是否包含相同的对象。如果是,那么你应该避免追加,否则继续追加。然后执行tableview.reloadData()。 –
但是,为什么.childAdded在没有添加孩子的情况下返回一些东西? – mikew
我认为你已经在viewDIdLoad和viewWillAppear中编写了相同的逻辑,所以两者都将同时调用,并且即使响应对象相同,两个响应也会附加到同一个数组self.games中。 –