当您按特定顺序请求子项时,生成的快照将包含与查询匹配的数据以及有关您请求它们的顺序的信息。
但是当你请求.value
快照的键+数据被转换为Dictionary<String,AnyObject>
。由于字典没有额外的位置来放置有关订单的信息,因此在转换为字典时该信息会丢失。
解决方案是不要过早转换为字典,而是循环快照:
queryRef.observeSingleEventOfType(.Value, withBlock: { (querySnapShot) in
for childSnapshot in querySnapShot.children {
print(childSnapshot.value)
}
})
您还可以收听.ChildAdded
事件,而不是.Value
,在这种情况下,孩子们将得到正确的值:
queryRef.observeSingleEventOfType(.ChildAdded, withBlock: { (childSnapshot) in
print(childSnapshot.value)
})
Update
我刚刚将此 JSON 添加到我的数据库中:
{
"users" : {
"alovelace" : {
"name" : "Ada Lovelace",
"score" : 4
},
"eclarke" : {
"name" : "Emily Clarke",
"score" : 5
},
"ghopper" : {
"name" : "Grace Hopper",
"score" : 2
}
}
}
然后运行这段代码:
let queryRef = ref.child("users").queryOrderedByChild("score").queryLimitedToLast(20);
queryRef.observeEventType(.ChildAdded) { (snapshot) in
print(snapshot.key)
}
输出是:
ghopper
爱乐花边
eclarke
这是按分数升序排列的用户。
更新以添加更多有关按降序排列分数的信息
上面的代码按升序获取 20 个最高分。没有 API 调用可以按降序分数返回它们。
但是在客户端反转 20 项并不存在性能问题,您只需要为其编写代码即可。参见示例这个答案 https://stackoverflow.com/questions/36314374/swift-how-to-create-sort-query-as-descending-on-firebase.
如果您确实坚持在客户端反转它们,则可以添加反转分数。看这个答案 https://stackoverflow.com/questions/36589452/in-firebase-how-can-i-query-the-most-recent-10-child-nodes/36665442#36665442举个例子。