【问题标题】:Read data to table view from firebase in real time实时从firebase读取数据到表视图
【发布时间】:2021-05-09 15:16:42
【问题描述】:

您好,我正在从 firebase 写入和检索数据,写入一些数据后,我需要关闭应用并重新打开以查看添加的数据。

private let ref = Database.database().reference().child("categories")
   viewDidLoad(){
self.ref.observeSingleEvent(of: .value, with: { (snapshot) in
            for user_child in (snapshot.children) {
                
                let user_snap = user_child as! DataSnapshot
                let dict = user_snap.value as! [String: Any]
                
                self.categoryId.append(user_snap.key)
                
            }
        })

【问题讨论】:

  • 你能发布你的代码吗?
  • 更新了我的帖子 :) @Mat

标签: swift database xcode firebase


【解决方案1】:

听起来您成功地在应用中展示了数据,但您希望数据是实时的,以便每次数据库发生变化时更新您的数据视图(表格视图或其他)。

viewDidLoad 仅在创建 viewController 时调用,这就是为什么在重新启动应用程序之前不会获取新数据的原因。

您可以保留observeSingleEvent,但在viewWillAppear 或其他函数中调用,而不是viewDidLoad

但是,更好的方法是使用observe 而不是observeSingleEvent。可以从viewDidLoad 拨打此电话;您的数据会实时更新。

更新

您可以只切换到观察而不是观察单事件。

self.ref.observe(.value, with: { (snapshot) in
    // Handle your data
})

请参阅文档了解更多上下文 (https://firebase.google.com/docs/database/ios/read-and-write)

更新 2

这是避免数据数组重复的方法:

self.ref.observe(.value, with: { (snapshot) in

    // Create an array to deal with the updated data
    let updatedCategoryIds = [String]()
    
    for user_child in (snapshot.children) {
            
        let user_snap = user_child as! DataSnapshot
        let dict = user_snap.value as! [String: Any]
        updatedCategoryIds.append(user_snap.key)
            
    }

    self.categoryIds = updatedCategoryIds

    // Now that self.categoryIds holds real time data without duplicates you can present the data 
})

【讨论】:

  • 嘿,谢谢你帮助我!你能告诉我代码需要用观察而不是观察单事件来查看吗?谢谢!
  • 恭喜!它实时显示数据,但现在数据翻了一番
  • @adirbuilder 等一下,我会更新我的答案
  • 好的@adirbuilder,检查一下
【解决方案2】:

如果您已将新数据推送到数据库,这是获取数据的函数

extension YourViewController: NSFetchedResultsControllerDelegate {
    
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        
        //Fetch Your Data

    }
    
}

【讨论】:

  • 嘿,感谢您尝试解决我的问题!我必须在这个函数中添加什么?
  • 你必须把获取数据的过程。每次您上传新内容时,它都会从您的数据库中重新加载数据。
  • 你能给我发这个抓取的例子吗?
  • @AisultanAskarov 您应该尝试帮助 OP 使用他们已有的东西。在这种情况下,OP 使用他们使用的代码接近解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多