有許多解決方案,並時常加載所有用戶數據的數據過多。
下面是一個典型的用戶節點
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