Swift 使用observeSingleEvent读取Firebase数据库中的数据两次

Swift 使用observeSingleEvent读取Firebase数据库中的数据两次,swift,firebase,firebase-realtime-database,tableview,Swift,Firebase,Firebase Realtime Database,Tableview,现在已经过了好几个小时了,我正在努力挖掘互联网论坛,试图找到解决我问题的方法,但我不知道发生了什么,所以我希望这里的人能帮助我。) 我有一个swift应用程序,在我的一个ViewController上,我想做的是从Firebase数据库检索数据,并将它们显示在我的tableview上 在这里,您可以看到我的数据是如何组织的 为了获得我的tableview中的行数,我将其放入ViewWillExample部分 override func viewWillAppear(_ animated: Boo

现在已经过了好几个小时了,我正在努力挖掘互联网论坛,试图找到解决我问题的方法,但我不知道发生了什么,所以我希望这里的人能帮助我。)

我有一个swift应用程序,在我的一个ViewController上,我想做的是从Firebase数据库检索数据,并将它们显示在我的tableview上

在这里,您可以看到我的数据是如何组织的

为了获得我的tableview中的行数,我将其放入ViewWillExample部分

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Count the number contacts to get the correct number of lines in the table

        let ref_table = ref.child("users").child((user?.uid)!).child("emergencyContacts")
        print("Starting observing")
        ref_table.observe(.value, with: { (snapshot: DataSnapshot!) in
            print("Got snapshot")
            print(snapshot.childrenCount)
            let count = snapshot.childrenCount
            self.numberOfContact = Int(count)
            self.UI_contactsTableView.reloadData()
            ref_table.removeAllObservers()
        })
        print("Returning count")
    }
然后,为了得到行数,我有这个

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("Number of contact TV: \(numberOfContact)")
        return numberOfContact
    }
并填充我的tableview的单元格

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "contact-cell") as! EmergencyContactCell
        print("value of numberOfContact \(numberOfContact)")
        ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in
                print("snapshot value \(snapshot.value!)")

                for rest in snapshot.children.allObjects as! [DataSnapshot] {
                    guard let restDict = rest.value as? [String:Any] else { continue }
                    let firstName = restDict["contact_firstName"] as? String ?? ""
                    cell.UI_fullName.text = "\(firstName)"
                }
            })
        return cell
    }
我认为这就是问题的症结所在,因为在控制台中,无论我做什么,我都会不断地显示两组数据,所以我的单元格总是用你能看到的相同名称填充

这也是程序执行后对我的控制台的捕获

Starting observing
Returning count
Number of contact TV: 0
Number of contact TV: 0
Number of contact TV: 0
Got snapshot
2
Number of contact TV: 2
value of numberOfContact 2
value of numberOfContact 2
snapshot value {
    1ArkUu6pMPZPgf3pGFAvvxHiTPFaf5Cl =     {
        "contact_firstName" = Kate;
        "contact_lastName" = Bell;
        "contact_phoneNumber" = "(555) 564-8583";
    };
    s8haDrYYAT9Y12ZnmAfE87pDyjDZGwjx =     {
        "contact_firstName" = Daniel;
        "contact_lastName" = Higgins;
        "contact_phoneNumber" = "555-478-7672";
    };
}
snapshot value {
    1ArkUu6pMPZPgf3pGFAvvxHiTPFaf5Cl =     {
        "contact_firstName" = Kate;
        "contact_lastName" = Bell;
        "contact_phoneNumber" = "(555) 564-8583";
    };
    s8haDrYYAT9Y12ZnmAfE87pDyjDZGwjx =     {
        "contact_firstName" = Daniel;
        "contact_lastName" = Higgins;
        "contact_phoneNumber" = "555-478-7672";
    };
}

提前感谢您的帮助:)

您的CellForRowatinex路径方法中有一个错误

 `ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in'
每次调用CellForRowatineXpath方法时,上行将返回所有紧急联系人

在for循环中,始终循环并选择最后一个值


您需要提取特定索引路径的值。

CellForRowatinex路径方法中存在错误

 `ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in'
每次调用CellForRowatineXpath方法时,上行将返回所有紧急联系人

在for循环中,始终循环并选择最后一个值


您需要提取特定索引路径的值。

我找到了它,我尝试了完全不同的推理,结果成功了。实际上,我使用了一个处理程序来管理所有这些。我把我的代码贴在这里,它可以帮助那些和我几个小时前一样陷入困境的人

var emergencyContactList = [EmergencyContact]()


override func viewDidLoad() {
        super.viewDidLoad()
        ref = Database.database().reference()
        fetchUsers()
    }

func fetchUsers() {
        refHandle = ref.child("users").child((user?.uid)!).child("emergencyContacts").observe(.childAdded, with: { (snapshot) in
            if let dictionary  = snapshot.value as? [String:AnyObject] {
                print(dictionary)
                let emergencyContact = EmergencyContact()
                emergencyContact.setValuesForKeys(dictionary)
                self.emergencyContactList.append(emergencyContact)
                DispatchQueue.main.async {
                    self.UI_contactsTableView.reloadData()
                }
            }
        })
    }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return emergencyContactList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "contact-cell") as! EmergencyContactCell
        let _firstName = emergencyContactList[indexPath.row].contact_firstName ?? ""
        let _lastName = emergencyContactList[indexPath.row].contact_lastName ?? ""
        let _phoneNumber = emergencyContactList[indexPath.row].contact_phoneNumber ?? ""
        cell.UI_fullName.text = "\(_firstName) \(_lastName)"
        cell.UI_phoneNumber.text = "\(_phoneNumber)"
        return cell
    }
我有一份swift文件,除了EmergencyContact.swift

import Foundation

class EmergencyContact: NSObject {
    @objc var contact_firstName:String?
    @objc var contact_lastName:String?
    @objc var contact_phoneNumber:String?
}
现在它就像一个符咒!
感谢导师花时间回答我:)

我想出来了,我尝试了完全不同的推理,结果成功了。实际上,我使用了一个处理程序来管理所有这些。我把我的代码贴在这里,它可以帮助那些和我几个小时前一样陷入困境的人

var emergencyContactList = [EmergencyContact]()


override func viewDidLoad() {
        super.viewDidLoad()
        ref = Database.database().reference()
        fetchUsers()
    }

func fetchUsers() {
        refHandle = ref.child("users").child((user?.uid)!).child("emergencyContacts").observe(.childAdded, with: { (snapshot) in
            if let dictionary  = snapshot.value as? [String:AnyObject] {
                print(dictionary)
                let emergencyContact = EmergencyContact()
                emergencyContact.setValuesForKeys(dictionary)
                self.emergencyContactList.append(emergencyContact)
                DispatchQueue.main.async {
                    self.UI_contactsTableView.reloadData()
                }
            }
        })
    }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return emergencyContactList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "contact-cell") as! EmergencyContactCell
        let _firstName = emergencyContactList[indexPath.row].contact_firstName ?? ""
        let _lastName = emergencyContactList[indexPath.row].contact_lastName ?? ""
        let _phoneNumber = emergencyContactList[indexPath.row].contact_phoneNumber ?? ""
        cell.UI_fullName.text = "\(_firstName) \(_lastName)"
        cell.UI_phoneNumber.text = "\(_phoneNumber)"
        return cell
    }
我有一份swift文件,除了EmergencyContact.swift

import Foundation

class EmergencyContact: NSObject {
    @objc var contact_firstName:String?
    @objc var contact_lastName:String?
    @objc var contact_phoneNumber:String?
}
现在它就像一个符咒!
感谢应用程序导师花时间回答我:)

好吧,那为什么我的手机填得不好?好吧,那为什么我的手机填得不好?