Цикл снимка .values ​​является случайным? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть нижеприведенная функция, которая должна циклически перебирать медиа в листинге, чтобы получить «статистику», такую ​​как 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
            }
        }
    }
}

Вывод: из печати (mediaNumber, «Этот номер носителя»)

Необязательно (3) Это номер носителя

Необязательно (1) Этот номер носителя ...

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

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

  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"])
        }
    }
0 голосов
/ 11 марта 2019

Нет гарантии порядка записей в словаре. Только то, что каждый уникальный ключ будет возвращать соответствующее значение.

И, да, он будет казаться случайным, поскольку зависит от хэша ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...