iOS: Как получить и перемешать данные autoID пользователей, хранящиеся в дочернем узле firebase? - PullRequest
0 голосов
/ 20 февраля 2019

В настоящее время мои данные структурированы в firebase следующим образом:

Изображение: структура Firebase

Я хотел бы получить случайный autoID из дочернего узла следующегои представьте его как параметр в формате с множественным выбором, чтобы он выглядел следующим образом (где параметры A, B, C, D являются случайными, но не одинаковыми):

Изображение: какприложение должно выглядеть

Я новичок в Swift и Firebase, поэтому мне было интересно, если вы можете помочь мне с кодом, который я могу написать:

  1. Введитедочерний узел, который показывает, за кем следует пользователь

  2. Извлечение 4 случайных AutoID из списка и представление их в виде параметров A, B, C, D

  3. Разрешение опциям быть UIButtons (или аналогичными), чтобы я мог отправить этот экран пользователю, который был выбран (в качестве уведомления)

  4. Представление 4 фотографий профиля пользователя (profileImageUrl)) в UIImageview, чтобы вы могли просматривать их (- это дополнительный шаг, но мытакже был бы признателен за помощь в этом)

Я надеюсь, что это имеет смысл,

Большое спасибо заранее:)

1 Ответ

0 голосов
/ 20 февраля 2019

В этом вопросе есть несколько вопросов, поэтому давайте ответим на один.

Как выбрать случайный узел из базы данных 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

и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...