firebase swift tableview在获取数据时加倍

时间:2018-04-09 17:29:50

标签: swift firebase

我是快速编程的新手。

我目前正在为我的应用程序处理收件箱Feed。我可以从firebase获取我的值并轻松地在UITableView中显示它们但我的问题来自于我从firebase添加或删除子节点时。

我的问题:当我在收件箱视图控制器中并收到新邮件时,我的数据会翻倍。不是在我的火力库中,而是在我的列表中。

我做了什么:每次修改firebase子值list.removeAll()时,我在fetchRequests函数中尝试了ref.observe(.value //...)。此外,当我尝试ref.observe(.childAdded //...)并打开我的inboxViewController时,没有任何内容出现。

我的代码

func FetchRequests() {

        self.requestList.removeAll()

        let ref = Database.database().reference().child("Users").child(userID!).child("Requests")

        ref.observe(.value, with: { (snapshot) in
            for child in snapshot.children.allObjects as! [DataSnapshot] {
                if let value = child.value as? NSDictionary {

                    let req = Requests()

                    req.from = value["from"] as? String ?? "From unknown"
                    req.name = value["name"] as? String ?? "Erreur"
                    req.img = value["img"] as? String ?? "Erreur"
                    req.other = value["other"] as? String ?? "Erreur"
                    req.type = value["type"] as? String ?? "Erreur"
                    req.key = child.key

                    self.requestList.append(req)
                    DispatchQueue.main.async {
                        self.tableViewRequests.reloadData()
                    }
                }
            }
        }, withCancel: nil)
    }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            let ref = Database.database().reference().child("Users").child(userID!).child("Requests").child(requestList[indexPath.row].key!)

            let reqType = requestList[indexPath.row].type

            if reqType?.range(of:"Réponse") != nil {
                print("Answer from admin")
                requestList.remove(at: indexPath.row)
                ref.removeValue()
            }

            DispatchQueue.main.async {
                self.tableViewRequests.reloadData()
            }
        }

我想要什么:在我的收件箱控制器中收到新邮件时,只需删除重复问题。

我顺便使用swift 4, 提前致谢, 有一个美好的一天/傍晚/晚上!

2 个答案:

答案 0 :(得分:0)

您可以在observe函数中将observeSingleEvent更改为fetch requests

在获取完成后,您可以添加observe add child事件并仅接收新对象。

答案 1 :(得分:0)

循环结束后,应重新加载您的 数据。只需如下修改您的代码:

func FetchRequests() {
    self.requestList.removeAll()
    let ref = Database.database().reference().child("Users").child(userID!).child("Requests")
    ref.observe(.value, with: { (snapshot) in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            if let value = child.value as? NSDictionary {
                let req = Requests()
                req.from = value["from"] as? String ?? "From unknown"
                req.name = value["name"] as? String ?? "Erreur"
                req.img = value["img"] as? String ?? "Erreur"
                req.other = value["other"] as? String ?? "Erreur"
                req.type = value["type"] as? String ?? "Erreur"
                req.key = child.key
                self.requestList.append(req)          
            }
        }
        DispatchQueue.main.async {
           self.tableViewRequests.reloadData()
        }
    }, withCancel: nil)
}