我正在使用firebase为我们的手机游戏建立一个全球排行榜和社交排行榜。由于游戏将有10个或1000个条目用于高分,因此不建议加载完整的条目列表,因此我们将使用分页。但是我想加载当前球员的位置,而不是加载整个列表。
例如:排行榜有100名玩家,用户XYZ排在65位。有没有办法在不加载整个列表的情况下得到65?
发布于 2016-06-14 21:36:32
如果不下载所有密钥,就无法知道特定密钥的索引。这是一个简单的操作,与Firebase的API不匹配,主要是由于数据库的实时性。
发布于 2016-06-14 21:40:01
这并不一定有一个简单的解决方案。如果你想返回第n个项目,这篇文章可能会很有用:Can I get the nth item of a firebase "query"?
但是,您绝对可以在不加载整个列表的情况下使用orderBy和limitToFirst返回前65名。就像yourRef.orderByChild('points').limitToFirst(65)一样。
可能不像您希望的那么简单,但我希望它能有所帮助。
发布于 2016-06-15 01:46:31
这可能是一个非常简单的答案,但它实际上取决于您如何构建数据结构。
如果在任何时候都有100个用户,并且你希望所有人都从65位到1位,那就很容易了。
同样,如果你想知道用户XYZ的位置,这也很简单。
还有一些方法可以按位置(或35)加载前2名用户
users:
user_id_0
position: 15
user_id_1
position: 32
user_id_2
position: 7然后对/users/位置进行查询,按位置排序,然后queryLimitedToFirst(2)将返回user_id_2和user_id_0。
编辑:
根据更多的数据,这里有更多的选择。假设我们有5个用户,每个用户都有一个分数(我注意到了他们在列表中的‘位置’)
uid_0: 50 //pos 2
uid_1: 25 //pos 1
uid_2: 73 //pos 4
uid_3: 10 //pos 0
uid_4: 58 //pos 3如果你想知道位置,基于uid_2的分数-我不知道你的平台,所以我会给出一个通用的流程:
步骤1)查询uid_2以获得他的分数,73,然后
步骤2) queryOrderedByChild(score).startingAtValue(73),获取得分从73到最高值的节点
步骤3)然后结果将在快照中,因此检查snapshot.childrenCount,如果是uid_2,则该位置为4。这将减少加载的节点数量。
缺点是,列表越靠下,加载的数据就越多。如果你只有1000个节点,其中只有分数,那就不是很多的数据。
下面的解决方案避免了大量数据,但需要应用程序做更多的工作。
当然,如果你的平台支持数组,这是一个非常简单的任务。使用与上面相同的结构,将孩子加载到和数组中,并获取您想要知道其位置的uid的索引号。
Swift代码
let ref = self.myRootRef.childByAppendingPath("scores")
ref.queryOrderedByValue().observeEventType(.Value, withBlock: { snapshot in
var myArray = [String]()
for child in snapshot.children {
let key = child.key as String
myArray.append(key)
}
let pos = myArray.indexOf("uid_0")
print("postion = \(pos!)")
})https://stackoverflow.com/questions/37812599
复制相似问题