В этом вопросе есть несколько вопросов, поэтому давайте ответим на один.
Как выбрать случайный узел из базы данных Firebase Realtime.Ну, вы не делаете этого с Firebase API, так как Firebase не предлагает такую функциональность.Однако вы все равно можете это сделать.
Сначала давайте начнем с типичного пользовательского узла
users
uid_0
name: "Frank"
uid_1
name: "Leroy"
uid_2
name: "Henry"
uid_3
name: "Fred"
Так что, если это пользовательский узел, вы можете использовать его для этого решения.Однако у многих пользователей узла хранится много других данных, и для выбора случайного узла нам нет дела до этих данных.То, что мы делаем, это создаем другой узел, который содержит только ключи узлов - это будет довольно небольшим, даже если есть тысячи пользователей
user_keys
uid_0: true
uid_1: true
uid_2: true
uid_3: true
Затем, чтобы выбрать случайный узел, мы загружаем всепользовательские ключи, используя .value, перебирают их, чтобы загрузить ключи в массив, затем генератор случайных чисел Swift 4., чтобы выбрать некоторые ключи, которые мы загружаем в другой массив.
Затем мы перебираем этот массив, чтобы получитьфактические пользовательские узлы из Firebase.Нам также не нужны дубликаты, поэтому, когда мы выбираем узлы из массива, мы удаляем эти узлы, чтобы они не выбирались снова.Вот функция, позволяющая выбрать 3 случайных узла, получить данные о пользователях и распечатать имя пользователя.
func getThreeRandomNodesAndPrintUserName() {
var myKeyArray = [String]()
let ref = self.ref.child("user_keys")
//retreives all nodes in the user_keys node
ref.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children { //build the array of keys
let snap = child as! DataSnapshot
let key = snap.key
myKeyArray.append(key)
}
var randomKeyArray = [String]()
for _ in 0...2 { //will iterate three times
let count = myKeyArray.count //get the number of elements
let randomInt = Int.random(in: 0..<count) //get a random index for the array
let randomUserKey = myKeyArray[randomInt]
randomKeyArray.append(randomUserKey)
myKeyArray.remove(at: randomInt) //remove that object so it's not selected again
}
let numberOfKeys = randomKeyArray.count
for i in 0..<numberOfKeys {
let thisUserKey = randomKeyArray[i]
let userRef = self.ref.child("users").child(thisUserKey)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let name = snapshot.childSnapshot(forPath: "name").value as! String
print(name)
})
}
})
}
, а затем просто вызов этой функции выведет имена трех случайных пользователей
self.getThreeRandomNodesAndPrintUserName()
и вывод для первого запуска
Fred
Frank
Henry
, а затем для второго запуска
Henry
Leroy
Fred
и т. д.