在Firebase Observer中获取条件条件

时间:2018-11-03 23:47:09

标签: ios swift firebase firebase-realtime-database

我正在尝试在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)
            }
        })
    }

1 个答案:

答案 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"