gpt4 book ai didi

swift - Firebase & swift 使用.indexOn 对数据快照进行排序

转载 作者:搜寻专家 更新时间:2023-11-01 06:18:52 24 4
gpt4 key购买 nike

我是 Firebase/swift 新手,我正在尝试使用 .indexOn 对服务器上的一组节点进行排序。我已经搜索过 SO 和文档来编写规则,但我正在为使用索引的 swift 代码的正确格式而苦苦挣扎。

我的假设是,当我使用 .indexOn 规则时,返回的快照使用该索引对结果进行排序。通过在 swift 中使用 .queryOrderedByChild("title"),我否定了创建索引的服务器端性能优势。如果这个假设不正确,请纠正我。

这是我的 Firebase 数据库结构的简化片段:

{
"users": {
"GkdjgdBJh1TxuAzIPezLWRouG9f2": {
"messages": {
"-KM0crettRl-RLQQdmMQ": {
"body": "Anyone want a bit of body string?",
"title": "5 Another title string",
},
"-KM0dhkChY6ZQ2QzuPlC": {
"body": "This is a short body string",
"title": "1 A lovely title string",
},
"-FQ0dhkChY6ZQ2Qzu3RQv": {
"body": "Short and sweet body string",
"title": "3 I should be in the middle",
}
}
}
}
}

这是我的规则 JSON:

{
"rules": {
".read": true,
".write": true,
"users": {
"$userid": {
"messages": {
".indexOn": ["title"]
}
}
}
}
}

这是我的快速代码:

if let user = FIRAuth.auth()?.currentUser {
// user is logged in

// *** I think this is the line with the issue ***
FIRDatabase.database().reference().child("users").child(user.uid).child("messages").observeEventType(.Value, withBlock: { (snapshot) in
messageArray = []

if let dictionaryOfMessages = snapshot.value as? [String: AnyObject] {
for messageKey in dictionaryOfMessages.keys {
messageArray.append(Message(json: JSON(dictionaryOfMessages[messageKey]!)))
// set the messageId
messageArray[messageArray.count - 1].messageId = messageKey
}
}
// return the data to the VC that called the function
success(messages: messageArray)
}) { (error) in
// Handle the Error
}
} else {
// return some generic messages about logging in etc.
}

任何关于如何修改我的 Swift 代码以使用索引(或者如果错误则更正索引)的建议都会很棒。

最佳答案

首先,您需要遵循 Jad 的回答并指定您希望接收子节点的顺序。一个列表可以有很多索引,您需要指定您希望此特定查询的顺序。

指定顺序后,Firebase 数据库会返回一个快照,其中包含与您的查询匹配的节点以及有关这些节点在结果中出现的顺序的信息。

但是字典没有关于 child 顺序的任何信息。因此,当您的代码将快照转换为字典时,有关订单的所有信息都将丢失:

if let dictionaryOfMessages = snapshot.value as? [String: AnyObject] {

因此最好使用快照的内置方法迭代子节点:

for child in snapshot.children {
let key = child.key as String
print(key)
messageArray.append(Message(json: JSON(child.value))) // JSON handling via SwiftyJSON
// set the messageId
messageArray[messageArray.count - 1].messageId = key
}

关于swift - Firebase & swift 使用.indexOn 对数据快照进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com