gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:59:14 27 4
gpt4 key购买 nike

现在已经好几个小时了,我一直在浏览 Internet 论坛,试图找到解决我问题的方法,但我不知道发生了什么,所以我希望这里有人能提供帮助)

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

在这里您可以看到我的数据是如何组织的。 Firebase org of data

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

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
}

并填充我的表格 View 的单元格

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
}

我认为这就是它变得糟糕的地方,因为在控制台中,无论我做什么,我都会不断显示 2 组数据,所以我的单元格总是填充相同的名称,如您所见 here .

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

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";
};
}

在此先感谢您的帮助:)

最佳答案

您的 cellForRowAtIndex Path 方法有错误。

 `ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in'

每次调用 cellForRowAtIndexPath 方法时,以上行返回所有紧急联系人。

在您的 for 循环中,您总是循环遍历并选择最后一个值。

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

关于swift - Firebase 数据库中的数据使用 observeSingleEvent 读取两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141527/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com