导航回tableview View Controller时更新tableview而不是整个重新加载

时间:2017-09-14 02:05:21

标签: swift uitableview firebase swift3 firebase-realtime-database

我的主页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()
            }
        })
    }
}

1 个答案:

答案 0 :(得分:3)

我认为您可以使用observeSingleEvent.childAdded

您可以在viewDidLoadviewWillAppear中的单个孩子中加载所有数据,因为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
                    }

            }
    }