我的主页UIViewController
包含UITableView
。在此视图控制器上,我通过从ViewWillAppear
中的firebase读取数据来显示当前用户的所有游戏。从该视图控制器,用户可以按下按钮以开始新游戏,并且该按钮将它们带到下一个视图控制器以选择设置,然后更新firebase中的数据并添加新的孩子。一旦他们导航回家庭视图控制器,无论如何只是更新数据并添加新的孩子,而不是像我现在那样再次加载桌面视图的所有游戏?
这是我目前的代码:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let currentUserID = Auth.auth().currentUser?.uid {
let gamesRef = Database.database().reference().child("games").child(currentUserID)
self.games = []
gamesRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let game = child as! DataSnapshot
self.games.append(game)
self.tableView.reloadData()
}
})
}
}
答案 0 :(得分:3)
我认为您可以使用observeSingleEvent
和.childAdded
您可以在viewDidLoad
和viewWillAppear
中的单个孩子中加载所有数据,因为viewDidLoad
最初会被调用
由于两个方法最初都会被调用,所以我们可以有一个bool标志,这样我们可以控制哪些代码最初运行而哪些代码不运行,因为viewWillAppear
之后调用了viewDidLoad
所以我们更改了值在viewWillAppear
方法中使用此标志,然后使用此标志控制viewWillAppear
内代码的执行
class SomeVC: UIViewController {
var flag = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if flag {
//do your work here
}else {
flag = true
}
}
}
<强>编辑:强>
另一个解决方案可能是您在viewDidLoad
中没有执行任何操作并仅在viewWillAppear
中执行此操作,因为在此特定方案中,两个调用中的数据都相关(从Firebase获取数据)
class SomeVC: UIViewController {
var flag = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if flag {
//fetch only one child
}else {
//fetch all the data initially
flag = true
}
}
}