遍历快照.values是随机的吗?

时间:2019-03-11 02:27:55

标签: ios swift firebase firebase-realtime-database

我具有波纹管功能,该功能应该在清单帖子中的媒体之间循环播放,以获得likesnumComments之类的“统计信息”。但是问题是,开始的循环:for val in mediaDict像下面的 media4 {},media2 {} ...一样随机循环,而不是:media1 {} 2,依此类推上。

我该如何解决?

我尝试通过获取media num的值并将其传递到media对象的数组来解决此问题,但我认为即使它们是随机顺序的,理想的解决方案是将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 :(得分:0)

不能保证字典中条目的顺序。只有每个唯一键都会返回相应的值。

是的,由于它取决于密钥的哈希值,因此它会随机出现。

答案 1 :(得分:0)

您需要做两件事:

  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"])
        }
    }