(Swift + Firebase)转换observeSingleEvent以观察.childAdded

时间:2017-10-01 18:20:29

标签: ios swift firebase firebase-realtime-database

我的viewDidLoad函数中有一个observeSingleEvent,我希望将它更改为带有.childAdded的观察,以便它可以不断监听并在添加到数据库时添加对象。

这是从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()
            }
        }
    })

我现在遇到的另一个问题(除了它只加载一次)是每当我去应用程序中的另一个视图然后再回来它再次读取所有内容所以我得到了我的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 个答案:

答案 0 :(得分:1)

  1. 将observeSingleEvent改为观察。
  2. 每当观察新值时清空食物阵列。
  3. 在for-loop之外重新加载食物阵列,这样只有在将所有物品装入阵列后才能重新加载。

    {{1}}
  4. 通过在观察新值时清空食物数组,您可以确保仅显示数据库中存在的值,从而不会出现重复元素。