我正在尝试在Firebase Observer中执行条件操作。
本质上,我想检查座位是否被占用。
如果是,则可以检索订单。
如果不是,则将餐厅再次发送回搜索座位页面。
由于某些原因,即使满足条件(即车主输入了错误的座位号),也不会执行if !taken
中的代码。我已将其放在封闭内,它应该运行正确吗?
func retrieveData (){
var taken = false
var seatNumber = "**an Int from other page**"
let refCustomer = Database.database().reference().child("Restaurant").child("Customers")
refCustomer.queryOrdered(byChild: "Seat").queryEqual(toValue: "\(seatNumber)").observeSingleEvent(of: .childAdded, with: { (snapshot) in
if snapshot.exists() {
taken = true
let snapshotValue = snapshot.value as? [String : AnyObject] ?? [:]
self.customerFirstName = snapshotValue["Firstname"] as! String
self.customerLastName = snapshotValue["Lastname"] as! String
self.customerAllergy = snapshotValue["Allergy"] as! String
self.customerID = snapshot.key
self.allergy.text = self.customerAllergy
self.ptname.text = "\(self.customerFirstName) \(self.customerLastName)"
}
if !taken {
print ("oops")
self.performSegue(withIdentifier: "MainPage", sender: self)
}
})
}
答案 0 :(得分:0)
此代码存在很多问题,可能还有您的结构,所以让我看看是否可以为您指明正确的方向。
首先,您可以消除不需要的变量。简而言之
if snapshot.exists() {
//handle the snapshot
} else { //use else here as if the snapshot doesn't exist we want this code to run
print ("oops")
}
第二,确保您的结构是这样的
Customers
cust_0
Seat: 1
cust_1
Seat: 2
等
第三,这是一个字符串“ 1”
queryEqual(toValue: "\(seatNumber)")
,而您要查询一个Int,请输入
queryEqual(toValue: seatNumber)
查询一个1的Int
第四:
查询Firebase时,如果.childAdded找不到任何内容,闭包将不会执行。您应该使用.value。
来自.childAdded的文档
为每个现有孩子触发一次此事件,然后再次触发 每次将新子项添加到指定路径时。
因此,如果没有子节点与查询匹配,它将不会执行。
使用此
refCustomer.queryOrdered(byChild: "Seat")
.queryEqual(toValue: seatNumber)
.observeSingleEvent(of: .value, with: { (snapshot) in
而且...这是重要的部分,.value检索与查询匹配的所有节点,因此您需要遍历这些节点以使用子节点。假设只有一场比赛,那么您可以这样做
guard let allChildren = snapshot.children.allObjects as? [DataSnapshot] else {return}
let firstChild = allChildren.first
第五。从技术上讲这没关系
let f = snapshotValue["Firstname"] as! String
您保证Firstname节点始终存在。如果是这样,那就去吧。但是,更安全,更快捷的方法是这样做
let f = snapshotValue["Firstname"] as? String ?? "No First Name"