我想制作一些简单的成就系统。最好的方法是什么?现在我喜欢这个来查询成就,但像这样我不能有像青铜等徽章类型:
databaseRef.child("usersAchievements").child(currentUser.generalDetails.uid).observe(.childAdded, with: { (snapshot) in
if snapshot.value as? Int == 1{
self.achievements.append(snapshot.key)
}
self.tableView.reloadData()
}){ (error) in
}
但是我不认为这是最好的方法,因为我想在tableview中显示像青铜或黄金这样的价值,但是现在它是不可能的,因为我无法找到我应该如何构建它。
可以使用这样的JSON结构:
allAchievements
achievement1: 0 //e.g 0 is bronze and 1 is silver
achievement2: 1
usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID
achievement1
type: gold
username: true
achievement2
username: true
type: silver
或者像这样拥有JSON更好:
allAchievements
achievement1: 0
achievement2: 0
usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID
achievement1: true
achievement2: true
我似乎无法找到合适的答案。
我希望在tableview中看到类似的成就,棕色点是青铜色,金色或银色:
答案 0 :(得分:1)
我建议使用第二个选项,因为它使您的树更简单。就个人而言,我会进一步折射它。
首先,我将摆脱allAchievements
节点。这似乎相当多余。除非您计划向用户展示所有可用的不同成就,否则我只是将其删除。另外,作为用户,当我将 bronze 视为成就之一时,我会自动假设他们的银和 gold < / em>或类似的东西。但即使作为开发人员,您也知道所有级别,因此您只需将其列出即可。总而言之,我会摆脱节点。
其次,我将构建成就,而不是
usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2
bronze: true
silver: true
想要更新时会发生什么?两种方式
对于创建的每个新UUID
,您可以默认创建所有成就节点,并为其指定值false
。解锁成就后,您只需更新相应的值。
usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2
bronze: true // user earned this so its true
silver: false // not earned so false but node already exists
gold: false // not earned so false but node already exists
仅在获得的基础上创建新成就。
usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2
bronze: true // only one earned by the user
第一个选项很好,因为您只需更新每个成就节点。但是我认为你可以看到当你有很多不同的成就时会有多么可怕/复杂。您将拥有大量与用户无关的数据。
另一方面,第二个选项保证信息与特定用户相关,但您必须跟踪创建选项。
PS :如果您选择使用第二个选项,则应该在节点为空时处理;用户尚未在客户端获得任何成就。
答案 1 :(得分:1)
如果您的成就是动态的,请将它们存储在一个节点中,并在其上保留一个观察者,这样如果添加了一个新的,则会通知所有客户端。您将使用它来填充代码中的字典(例如achievementDict)以用作查找。
achievement_list
-Uom9a9smmpasdm
name: "Bronze"
-Jiaiisiask9jkm
name: "Silver"
-Ykmsimiaooooos
name: "Gold"
-IJij00mlso09m9
name: "Supa Dupa"
然后为您的用户,在其用户节点中保留对其成就的引用
users
-Yiniasopksdpok
user_name: "Leroy Brown"
achievements:
-Ykmsimiaooooos: true
-IJij00mlso09m9: true
-JYimpoaosmoso
user_name: "Marco Polo"
achievements:
-Uom9a9smmpasdm: true
有了这个,你知道Leroy有金牌,Supa Dupa和Marco Polo是银牌。
您想要使用成就的实际名称&#34; Bronze&#34;,&#34; Silver&#34;等等,这些都保存在您的应用程序的字典中,如果添加了新的成就,则会更新。
当您的用户列表(或其他)显示时,您可以通过该键从该词典中查找每个成就。
let achievementName = achievementDict["-IJij00mlso09m9"]
将取回Supa Dupa