我正在尝试使用Firebase创建排行榜并显示用户名,高分,区域。

我的目标是使用Firebase创建排行榜,并在tableview中显示用户名,高分和区域。 我当前的数据库看起来像这样 在此处输入图像描述

目前我手头有一切。 我是这样做的,所以我可以增加当前用户的数据。 不幸的是,通过这样做,我认为我不能让别人看到别人的高分或用户名。 是否有使用当前节点设置的此问题的解决方案,或者我是否需要更改它。 如果是这样,有人可以举例说明数据库的外观。

您应该将您的用户特定数据与排行榜分开。

您拥有用户节点,其中用户的数据位于其唯一用户ID下。 然后,您还可以创建排行榜节点,并在相同的唯一用户ID下创建排行榜特定数据。 这样,您不必一次获取所有数据,只知道用户特定数据。

连接是用户ID,即用户将要知道的唯一ID,并通过以下方式检索他/她的数据。 其他玩家可以通过查询检索排行榜节点。 您还应该存储一些看似冗余的数据,例如用户节点和排行榜都需要的用户名。

不要忘记应用安全规则,因此用户只能写入他/她的数据。

看起来像这样:

在此处输入图像描述

然后,知道他/她的UID的经过身份validation的用户可以通过在此路径上获取数据来收听他/她自己的排行榜得分:“排行榜/ UID”权限。

其他玩家应该只需使用路径:“排行榜”来获取排行榜上的每个玩家。 要订购它们并且只获取前十名玩家,您必须使用查询。

使用queryOrderedByChild按高分排序您的数据为此,您还应添加安全规则:“。indexOn”:“highscore”。

要获取前10名玩家使用queryLimitedToFirst将其设置为10,它将只下载前10名玩家。

您应该阅读有关查询的更多信息: https : //firebase.google.com/docs/database/ios/lists-of-data#sorting_and_filtering_data

使用JSON时,树越平坦越好

HighScore :{ userID1 : 100, userID2 : 103; userID3 : 210; }, Users :{ userID1 :{...} userID2 :{...} userID3 :{...} } 

如果要向用户添加其他关系属性,只需为该特定用户添加另一个父节点并进行查询。

 FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in print(Snap.value) }) 

PS: –您始终可以在firebase中使用安全规则,以将数据库中特定节点的权限操作到经过身份validation的用户Docs Link 。

要在firebase节点中附加数据: –

  FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in if let snapDict = Snap.value as? NSMutableDictionary{ snapDict.setObject(_yourHighScore, forKey : FIRAuth.auth()!.currentUser!.uid as NSCopying) FIRDatabase.database().reference().child("HighScores").setValue(snapDict) } }) 

再加上@Durian的答案,代码看起来应该是这样的,

 let leaderboardDB = Database.database().reference().child("leaderboards") leaderboardDB.queryOrdered(byChild: "score").queryLimited(toFirst: 100).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in if snapshot.exists() { print("Retrieving Data!") for child in snapshot.children { print("Do whatever you need to do with the data") } } else { print("DB no data!") } }) } 

您可以将queryOrder方法调用与queryLimited方法链接在一起以检索数据。 您不必为包装排行榜数据的userId打扰, queryOrdered(byChild: "score")方法将查看数据库中每个人的分数并相应地对其进行排序。

如果需要,可以将所有内容存储在用户节点下。 并通过基于高分应用排序来获取用户详细信息。 你也应该申请限额。

如果您计划为用户详细信息和分数创建单独的节点,则必须从分数节点获取分数,并根据用户ID从用户节点获取用户详细信息。