【发布时间】:2018-02-22 21:54:13
【问题描述】:
我有一个 UITableView,它由以下 firebase 数据库填充:
"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 就会运行,并且由于某种原因,即使没有添加子项,games 似乎也会附加一个重复的game。
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
}
更新:
感谢大家的回答!似乎我误解了 firebase .childAdded 的运作方式,感谢您所有试图帮助我的答案
【问题讨论】:
-
当你附加 self.games 数组时,你必须检查 self.games 数组是否包含与响应相同的对象。如果是,那么您应该避免追加,否则继续追加。然后执行 tableview.reloadData()。
-
但是为什么 .childAdded 如果没有添加子元素会返回一些东西?
-
我认为您在 viewDIdLoad 和 viewWillAppear 中编写了相同的逻辑,因此两者都会同时调用,并且即使响应对象相同,两个响应也会附加到同一个数组 self.games 中。
-
我只在初始加载后运行 viewWillAppear,这样它们就不会同时运行。这就是我在那里的布尔检查。
-
抱歉,我忘记在我的问题中包含 firstTimeLoad 的初始化,但它最初设置为 true,因此第一个 viewWillAppear 不会运行。
标签: ios firebase swift3 firebase-realtime-database