У вас есть два вложенных цикла над snapshot.children
, что, похоже, слишком много.
Похоже, вы начинаете со снимка для пользователя, а затем перебираете дочерние элементы его свойства Rating
.
for child in snapshot.childSnapshot(forPath: "Rating").children{
Итак, внутри этого цикла снимок child
относится к этому:
Rating: 3
User: k8rn16AAXbTLSyvinD92CugMbL53
Затем вы снова зацикливаетесь на этих потомках и пытаетесь прочитать каждого из них как [String:Any]
. Это не работает, так как каждое свойство здесь является одним значением. И поскольку вы не можете привести 3
к [String:Any]
, приложение вылетает.
Есть два варианта:
удалить внутреннюю петлю:
for child in snapshot.childSnapshot(forPath: "Rating").children{
let child = child as! DataSnapshot
let dict = child.value! as! [String:Any]
}
не приведите к [String:Any]
, но просто получите простое значение:
for child in snapshot.childSnapshot(forPath: "Rating").children{
let child = child as! DataSnapshot
for ratings in child.children{
let valueSnap = ratings as! DataSnapshot
let value = valueSnap.value! as! Any
}
}
Редактировать
Чтобы избежать «Any», следующий код получит рейтинг и пользовательские значения каждого дочернего узла напрямую.
let ratingsRef = self.ref.child("users").child("the user id")
ratingsRef.observeSingleEvent(of: .value, with: { snapshot in
let allRatingsSnap = snapshot.childSnapshot(forPath: "Rating")
for ratingSnap in allRatingsSnap.children.allObjects as! [DataSnapshot] {
let rating = ratingSnap.childSnapshot(forPath: "Rating").value ?? "no rating"
let uid = ratingSnap.childSnapshot(forPath: "User").value ?? "no user"
print("user uid: \(uid) rating: \(rating)")
}
})
и вывод
user uid: uid_1 rating: 3
user uid: uid_2 rating: 2