【问题标题】:(Swift + Firebase) Convert observeSingleEvent to observe .childAdded(Swift + Firebase)将observeSingleEvent 转换为observe .childAdded
【发布时间】:2017-10-01 18:20:28
【问题描述】:

我的 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"

【问题讨论】:

  • 只需写parentRef.observe(value, ....) - 这将使查询连续。
  • @matiastofteby 谢谢,它有效,但是它仍然复制对象,每当运行 viewDidLoad 时它都会一遍又一遍地重新加载所有内容,我该如何解决这个问题?

标签: ios swift firebase firebase-realtime-database


【解决方案1】:
  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()
        }
    })
    

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

【讨论】:

  • 很高兴为您提供帮助 :=)
  • 我怎样才能采用这种使用查询的方法,但能够在不删除/删除索引 0 处的内容的情况下侦听要追加的新项目?所以我的聊天可能有 10,000 多条消息。我想显示最后 100 个,但可以在聊天时添加并手动删除。
  • 您应该提出一个新问题,以便其他人也能找到答案。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多