Есть несколько отличных решений, но проблема в чтении узла по .value заключается в том, что он читает в все в этом узле.
Хотя это было бы хорошо для узлов, которые имеютограниченный объем данных, он будет перегружать устройство, когда узел содержит много данных.
Поэтому другой вариант - использовать, чтобы Firebase выполнял все события .childAdded до событий .value. Таким образом, мы можем использовать .value в качестве триггера, чтобы все узлы были прочитаны.
Вот функция, которая использует .childAdded для итерации и подсчета всех пользователей в узле users. Кроме того, существует наблюдатель .value, который считывает только последний узел, удаляет наблюдателя .childAdded и передает счет обратно вызывающей функции через обработчик завершения. Помните, что хотя мы присоединяем обоих наблюдателей, все события .childAdded будут срабатывать до события .value.
func countUsers( completion: @escaping(Int) -> Void) {
var count = 0
let usersRef = self.ref.child("users")
usersRef.observe(.childAdded, with: { snapshot in
count+=1
})
let query = usersRef.queryOrderedByKey().queryLimited(toLast: 1)
query.observeSingleEvent(of: .value, with: { snapshot in
usersRef.removeAllObservers()
completion(count)
})
}
для вызова функции, вот код
func getUserCount() {
self.countUsers(completion: { userCount in
print("number of users: \(userCount)")
})
}