有许多解决方案,并时常加载所有用户数据的数据过多。
下面是一个典型的用户节点
users
uid_0
name: "Jean Luc"
uid_1
name: "Will"
uid_2
name: "Geordi"
一个选择是通过每个用户节点,一次一个迭代,以获取用户名。这完全避免了庞大的数据集。我们将使用.childAdded事件加载每个和存储在一个阵列
let usersRef = self.ref.child("users")
var userNamesArray = [String]()
usersRef.observe(.childAdded, with: { snapshot in
let userDict = snapshot.value as! [String: Any]
let name = userDict["name"] as! String
userNamesArray.append(name)
})
第二选项是对用户名存储在一个完全不同的节点,该节点显著降低了“杂波”为一体的其余部分数据保留在主节点的用户
user_names
uid_0: "Jean Luc"
uid_1: "Will"
uid_2: "Geordi"
正如你可以用这个结构看,即使有成千上万个名字,它只是一个非常小的足迹文本。
另一种方法是使用.startingAt和.endingAt一次加载X个用户,并遍历返回的用户以获取每个名称。在这种情况下,我们希望所有用户以A开头并以M结尾......对不起Worf。
let usersRef = self.ref.child("users")
var userNamesArray = [String]()
let nameQuery = usersRef.queryOrdered(byChild: "name")
.queryStarting(atValue: "A")
.queryEnding(atValue: "M\u{f8ff}")
nameQuery.observe(.value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let userDict = snap.value as! [String: Any]
let name = userDict["name"] as! String
userNamesArray.append(name)
}
})
的最后一个例子开始以A开头的用户名和与用户名结束了以M结尾+非常高的Unicode字符,这使得它包容了所有的名字开始以M
的\在上面的查询中使用的uf8ff字符是Unicode范围中的非常高的代码点 。因为它是在 Unicode中最常用的字符之后,所以查询匹配以queryString开头的所有值。
来源
2017-07-18 18:45:44
Jay
1)你的问题是过于宽泛。 2)显示你的尝试。 3)所有的问题很容易谷歌。 GL –
@VladPulichev我编辑的问题了一下。此外,如果你可以点我到这将是巨大的任何资源。 – Stefan