Ios 无法使用Firebase检索最近添加的值

Ios 无法使用Firebase检索最近添加的值,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我的应用程序中有两个视图控制器:第一个显示从Firebase数据库中提取的项目,第二个允许用户从数据库中添加和删除项目 问题是,当用户在第二个视图控制器中添加一个项目,并很快返回到第一个控制器时。这有时会导致Firebase数据库无法保存项目。因此,第一个视图控制器不会显示新添加的项目 在植入过程中,我会在视图中提取项目,然后在视图中删除Firebase listener observer。我怎样才能解决这个问题 // first view controller code var items

我的应用程序中有两个视图控制器:第一个显示从Firebase数据库中提取的项目,第二个允许用户从数据库中添加和删除项目

问题是,当用户在第二个视图控制器中添加一个项目,并很快返回到第一个控制器时。这有时会导致Firebase数据库无法保存项目。因此,第一个视图控制器不会显示新添加的项目

在植入过程中,我会在
视图中提取项目,然后在
视图中删除Firebase listener observer。我怎样才能解决这个问题

// first view controller code

var items = [Item]()

var ref: FIRDatabaseReference!

func fetchItems() {
    ref.child("items").observeSingleEvent(of: .value, with: { (snapshot) in
        self.items = []
        for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
            if let dictionary = child.value as? [String: AnyObject] {
                // Create item and append it to an items array
            }
        }
        self.tableView.reloadData()
    })
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)                
    self.fetchItems()
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    ref.removeAllObservers()
}

您不应该使用observeSingleEvent,因为您希望每次firebase数据库更改时都执行代码。所以,改变它:

func fetchItems() {
ref.child("items").observe(.value, with: { (snapshot) in
    self.items = []
    for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
        if let dictionary = child.value as? [String: AnyObject] {
            // Create item and append it to an items array
        }
    }
    self.tableView.reloadData()
})
}

这将创建一个侦听器。此外,由于以前没有创建观察者,因此不必使用
removeAllObservers()
。现在你有了一个,使用它是正确的。
希望有帮助

您可以显示视图控制器2的代码吗?Firebase异步工作,因此不必在viewController2中调用viewController1的tableView中的数据,而是使用viewController2中的委托来重新加载数据。谢谢。此代码的问题是,当用户在第一个视图控制器中滑动以删除单元格时,将触发侦听器,
self.tableView.reloadData()
不会给滑动时间来删除表视图动画。我可以查看该部分的代码吗?您是否正在使用editActionsForRowAt索引?什么样的动画应该执行?谢谢你的后续Jaime。我在
tableView(\utableview:UITableView,commit editingStyle:UITableViewCellEditingStyle,forRowAt indexath:indexPath)中使用
deleteSectionsAt
。好的,我已经考虑过了。我从未使用过该函数,但请尝试以下操作:当您调用
deleteSectionsAt
时,在删除Firebase中的任何值之前,请调用
removeAllObservers()
。这样就不会触发观察者,您将完成动画。完成后,调用
fetchItems()
。这将更新您的数据并恢复观察者,因此您将再次获得它。希望你这次没有问题:)谢谢Jaime,我很快就会试试这个方法!我主要担心的是,当用户快速删除项目时,tableview.reloadData()可能会碍事,并干扰一些动画。