我在查看didload函数中有一个观察力,我想将其更改为使用.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()
}
}
})
我现在遇到的另一个问题(此外,只有一次加载一次)是,每当我转到应用程序中的另一个视图然后再回来时,它将再次读取所有内容与观察?
编辑:
这是我的数据库的样子:
Recipes
-Kv7FAqgLtDrRoyGd-99
Description: "food description"
Name: "food name"
-KvBuzMUnIQXn8gpG2WL
Description: "food description2"
Name: "food name2"
-KvH6yYeJaThK7oP8xBj
Description: "food description3"
Name: "food name3"
- 改变观察的观察。
- 每当观察新值时,空食物阵列。
-
在循环外面重新加载食物阵列,以便只有在将所有物品加载到阵列中时才能重新加载。
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() } })
每当观察新值时清空食物阵列,您可以确保仅显示数据库中存在的值,从而永远不会具有重复性元素。