#ios #swift #firebase #firebase-realtime-database
#iOS #swift #firebase #firebase-база данных в реальном времени
Вопрос:
У меня есть нижеприведенная функция, которая должна перебирать медиа в публикации со списком, чтобы получить «статистику», подобную likes
и numComments
. Проблема, однако, в том, что цикл, который запускается: for val in mediaDict
кажется, что цикл выполняется случайным образом, как следующий media4{}, media2{} … вместо: media1{} 2 и так далее.
Как я могу это исправить?
Я попытался исправить это, получив значение media num и передав его в массив медиа-объектов, и все же я думаю, что даже если они расположены в случайном порядке, идеальным решением было бы иметь цикл функции firebase в правильном порядке.
var indexForStats = 0
func getMediaStats() {
print("stats index val", indexForStats)
databaseRef.child("MediaStats").child((post?.user.userID)!).child(postPath).observeSingleEvent(of: DataEventType.value) { (snap) in
print(snap, " This is the snapshot")
if snap.value is NSNull {
print("No stats (comments or likes)")
} else {
let mediaDict = snap.value as! [String: Any]
for val in mediaDict {
let mediaString = val.key
let lastCharacter = mediaString.last
let mediaNumber = Int(String(lastCharacter!))
print(val, " This sis val !!!")
let statsDict = val.value as! [String: Int]
print(mediaNumber!, " This is the media number")
if statsDict["likes"] != nil {
let likes = statsDict["likes"]!
self.post?.media[mediaNumber! - 1].likes = likes
} else {
print("No likes while fetching")
self.post?.media[mediaNumber! - 1].likes = 0
}
if statsDict["numComments"] != nil {
let comments = statsDict["numComments"]!
self.post?.media[mediaNumber! - 1].numberComments = comments
} else {
print("No comments")
self.post?.media[mediaNumber! - 1].numberComments = 0
}
self.indexForStats = 1
}
}
}
}
Вывод: для печати (номер носителя, «Это номер носителя sis teh»)
Необязательно (3) Это номер носителя
Необязательно (1) Это номер носителя sis…
Комментарии:
1. Используйте queryOrdered(byChild:).
2. @ElTomato как бы мне это сделать?
Ответ №1:
Нет гарантии порядка записей в словаре. Только то, что каждый уникальный ключ вернет соответствующее значение.
И, да, это будет выглядеть случайным, поскольку это зависит от хэша ключа.
Ответ №2:
Вам нужно сделать две вещи:
- Сообщите Firebase, в каком порядке возвращать дочерние элементы.
- Повторите цикл
DataSnapshot.children
, чтобы убедиться, что вы обрабатываете их по порядку.
В коде:
databaseRef.child("MediaStats").child((post?.user.userID)!).child(postPath)
queryOrderedByKey().observeSingleEvent(of: DataEventType.value) { (snap) in
print(snap, " This is the snapshot")
if !snap.exists() {
print("No stats (comments or likes)")
} else {
for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
print(child.key)
let statsDict = child.value as! [String: Int]
print(statsDict["likes"])
}
}