Перебор snapshot .values является случайным?

#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:

Вам нужно сделать две вещи:

  1. Сообщите Firebase, в каком порядке возвращать дочерние элементы.
  2. Повторите цикл 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"])
        }
    }