Получение условий для работы в Firebase Observer - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь выполнить условие в 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 голосов
/ 04 ноября 2018

Есть ряд проблем с этим кодом, и, возможно, с вашей структурой, поэтому давайте посмотрим, смогу ли я указать вам правильное направление.

Во-первых, вы можете устранить захваченный предмет, так как он не нужен. Короче

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)

, который запрашивает Int 1

Forth:

При запросе 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 всегда существует. Если это правда, то иди с этим. Тем не менее, более безопасный, более Swifty способ сделать это

let f = snapshotValue["Firstname"] as? String ?? "No First Name"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...