【问题标题】:Cannot retrieve recently added values with Firebase无法使用 Firebase 检索最近添加的值
【发布时间】:2017-04-04 18:52:10
【问题描述】:

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

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

就植入而言,我在 viewWillAppear 中获取项目,然后在 viewDidDisappear 中删除 Firebase 侦听器观察者。我该如何解决这个问题?

// 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()
}

【问题讨论】:

  • 你能显示 View Controller 2 的代码吗?
  • Firebase 是异步工作的,所以不要在 viewWillAppear 中调用数据,而是在 viewController2 中使用一个委托来为 viewController1 的 tableView 重新加载数据。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

您不应该使用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()。现在你有了一个,使用它是正确的。 希望对您有所帮助!

【讨论】:

  • 谢谢。这段代码的问题是,当用户在第一个视图控制器中滑动删除一个单元格时,将触发监听器,self.tableView.reloadData() 不会给时间让滑动删除表格视图动画完成。跨度>
  • 我能看到那部分的代码吗?您使用的是 editActionsForRowAt indexPath 吗?应该表现什么样的动画?
  • 感谢 Jaime 的跟进。我在tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 方法中使用deleteSectionsAt
  • 好的,我一直在考虑。我从未使用过该功能,但请尝试以下操作:当您调用 deleteSectionsAt 时,在删除 Firebase 中的任何值之前,请调用 removeAllObservers()。这样就不会触发观察者,您将完成动画。完成后致电fetchItems()。这将更新您的数据并恢复观察者,因此您将再次拥有它。希望你这次没有问题:)
  • 谢谢 Jaime,我很快就会试试这个方法!我主要担心的是,当用户真正快速删除项目时,tableview.reloadData() 可能会妨碍某些动画。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多