Swift 使用observeSingleEvent读取Firebase数据库中的数据两次
现在已经过了好几个小时了,我正在努力挖掘互联网论坛,试图找到解决我问题的方法,但我不知道发生了什么,所以我希望这里的人能帮助我。) 我有一个swift应用程序,在我的一个ViewController上,我想做的是从Firebase数据库检索数据,并将它们显示在我的tableview上 在这里,您可以看到我的数据是如何组织的 为了获得我的tableview中的行数,我将其放入ViewWillExample部分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
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?
}
现在它就像一个符咒!
感谢应用程序导师花时间回答我:)好吧,那为什么我的手机填得不好?好吧,那为什么我的手机填得不好?