ios - (Swift + Firebase) 将 observeSingleEvent 转换为观察 .childAdded

标签 ios swift firebase firebase-realtime-database

我的 viewDidLoad 函数中有一个 observeSingleEvent,我想将其更改为带有 .childAdded 的 observe,以便它会持续监听并在对象添加到数据库时添加它们。

这是从 firebase 读取的代码:

let parentRef = Database.database().reference().child("Recipes")

    parentRef.observeSingleEvent(of: .value, with: { snapshot in

        // PROCESSES VALUES RECEIVED FROM SERVER
        if ( snapshot.value is NSNull ) {

            // DATA WAS NOT FOUND
            print("– – – Data was not found – – –")

        } else {

            // DATA WAS FOUND
            for user_child in (snapshot.children) {

                let user_snap = user_child as! DataSnapshot
                let dict = user_snap.value as! [String: String?]

                // DEFINE VARIABLES FOR LABELS
                let recipeName = dict["Name"] as? String
                let recipeDescription = dict["Description"] as? String

                food.append(Element(name: recipeName!, description: recipeDescription!))

                self.tableView.reloadData()
            }
        }
    })

我现在遇到的另一个问题(除了它只加载一次)是,每当我转到应用程序中的另一个 View 然后返回时,它会再次读取所有内容,所以我会在我的 tableView 中获得所有内容的副本,这是否仍然会发生用观察?

编辑:

这是我的数据库的样子:

Recipes
   -Kv7FAqgLtDrRoyGd-99
       Description: "food description" 
       Name: "food name" 
   -KvBuzMUnIQXn8gpG2WL
       Description: "food description2"  
       Name: "food name2"  
   -KvH6yYeJaThK7oP8xBj
       Description: "food description3"  
       Name: "food name3"

最佳答案

  1. 更改 observeSingleEvent 以进行观察。
  2. 每当观察到新值时清空食物数组。
  3. 在 for 循环之外重新加载您的食物数组,以便仅在将所有项目加载到数组中时才重新加载。

    let parentRef = Database.database().reference().child("Recipes")
    
    // 1. Change to observe
    parentRef.observe(.value, with: { snapshot in
    
       // PROCESSES VALUES RECEIVED FROM SERVER
       if ( snapshot.value is NSNull ) {
    
           // DATA WAS NOT FOUND
           print("– – – Data was not found – – –")
    
       } else {
    
           // 2. Empty food array
           self.food = []
    
           // DATA WAS FOUND
           for user_child in (snapshot.children) {
    
               let user_snap = user_child as! DataSnapshot
               let dict = user_snap.value as! [String: String?]
    
               // DEFINE VARIABLES FOR LABELS
               let recipeName = dict["Name"] as? String
               let recipeDescription = dict["Description"] as? String
    
               food.append(Element(name: recipeName!, description: recipeDescription!))
    
            }
            // 3. reload tableview outside loop
            self.tableView.reloadData()
        }
    })
    

通过在每次观察到新值时清空食物数组,您可以确保只显示数据库中存在的值,因此绝不会出现重复元素。

关于ios - (Swift + Firebase) 将 observeSingleEvent 转换为观察 .childAdded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46515454/

相关文章:

Swift 4 委托(delegate)和传递文本字段数据

javascript - 如何在 node.js 和 Cloud Functions for Firebase 上获取正确的日期和月份?

ios - 与 8.0.2 相比,是什么导致 8.1 中的自转发生巨大变化?

ios - 删除中间 View 时自动布局折叠空间

ios - Fabric 为我的 iOS 应用程序通知我 "STABILITY ALERT",而应用程序运行正常,没有任何崩溃

ios - 读取自定义对象的数据以填充 TableView

swift - 如何添加要设置的 Realm 对象

php - 有没有办法在从 php 服务器发送的 Firebase 通知中实现 "expiration"时间?

javascript - Angular 5 - 回调的范围是否有限?

ios - iOS文件读写错误