Swift Firebase 访问子快照数据

3

我目前正在尝试从Swift中的子快照访问数据。这是我之前使用的代码(在Swift 3/Firebase更新之前可以正常工作):

 if let achievements = snapshot1.childSnapshotForPath("Achievements").children.allObjects as? [FIRDataSnapshot] {


                    if achievements.count != 0 {

                        if let val = achievements[0].value!["somevalue"] as? Int {
                            self.dict["somevalue"] = val
                        }


                    }

我在这里想要做的是创建一个子快照变量 (achievements),并从中访问子快照数据。achievements[0] 将简单地返回第一个值。然而,这似乎不起作用。我应该怎么处理?

我当前正在一个快照 ('observeType:.ChildAdded') 中完成此操作。

我的 Firebase 数据库看起来像这样:

Achievements{

randomId1 {
somevalue : somevalue
}

randomId2 {
somevalue2 : somevalue2
}
}

更新的代码:

 func loadData() {

        ref.child("Players").observe(FIRDataEventType.childAdded) { (snapshot:FIRDataSnapshot) in

            if let value = snapshot.value as? [String:AnyObject], let username = value["Username"] as? String {

            }

            if let value = snapshot.value as? [String:AnyObject], let ranking = value["Rank"] as? String {

            }

            if let childSnapshot = snapshot.childSnapshot(forPath: "Achievements").children.allObjects as? [FIRDataSnapshot] {

                if childSnapshot.count != 0 {

                    if let achievement1 = childSnapshot[0].value!["Rookie"] as? String {
                        print(achievement1)
                    }

                }
            }

        }

    }

JSON树:

Players {

PlayerID {

Username

Rank

Achievements {

Rookie: yes

}


}

请提供完整的函数以及您实际的JSON树,从您提供的内容中很难解读。 - Dravidian
我现在已经提供了完整的代码和JSON树。我真的找不到一种方法来获取childsnapshot数据,上面的代码返回一个错误。我也尝试将其定义为[String:AnyObject] - 但这只会导致nil。 - askaale
而且要明确的是,我只想从“新手”值中返回“是”。 - askaale
1个回答

5

尝试:

 if let childSnapshot = snapshot.childSnapshot(forPath: "Achievements") as? FIRDataSnapshot{

                if let achievementDictionary = childSnapshot.value as? [String:AnyObject] , achievementDictionary.count > 0{

                    if let achieveMedal = achievementDictionary["Rookie"] as? String {

                        print(achieveMedal)

             }        
       }
    }

这也是我尝试过的,但是它给我留下了以下错误信息:类型“Any”没有下标成员。 - askaale
尝试将[FIRDataSnapshot]替换为[String:AnyObject] - Dravidian
错误:'subscript'成员引用不明确。 - askaale
顺便说一下,我刚意识到我需要进一步更改代码 - 因为我想要检索多个成就。换句话说,在“成就”下,我需要有多个childByAutoID,其中再次包含我想要检索的值。我该怎么做?'if let achievementDictionary = childSnapshot.childAdded as? [String:AnyObject]' 显然不起作用。有什么建议吗? - askaale
请避免在评论中提出过多的新问题,Stack Overflow对您每天发布多少个问题没有限制。请提出一个不同的问题。 :) - Dravidian
让我们在聊天中继续这个讨论 - askaale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接