Есть ряд проблем с этим кодом, и, возможно, с вашей структурой, поэтому давайте посмотрим, смогу ли я указать вам правильное направление.
Во-первых, вы можете устранить захваченный предмет, так как он не нужен. Короче
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"