Быстрое извлечение всех пользователей в массив - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь извлечь всех пользователей в массив и использовать обратный вызов, когда это будет сделано. Мне нужно знать, когда загрузка завершена. Я понял, что это может не сработать, как я думал с childAdded, поэтому я пытаюсь с наблюдать за SingleEvent, но у меня возникают проблемы с получением в массив. Есть идеи почему?

Этот код с childAdded работает с помещением данных в массив, но не с завершением, даже если я помещаю его внутрь.

  self.ref?.child("Users").observe(DataEventType.childAdded, with: { (snapshot) in

                // Fetch users
                if let dictionary = snapshot.value as? [String: AnyObject] {
                    let user = User()
                    user.nameLabel = dictionary["Username"] as? String
                    user.occupationLocation = dictionary["Occupation"] as? String
                    user.ageLabel = dictionary["Age"] as? String
                    user.infoText = dictionary["Bio"] as? String
                    user.emailText = dictionary["email"] as? String

                    let email = user.emailText
                    let ref = Database.database().reference().child("Users")
                    ref.queryOrdered(byChild: "email").queryEqual(toValue: email).observeSingleEvent(of: .childAdded, with: { (snapshot) in
                        user.toId = snapshot.key

                    })

                            self.usersArray.append(user)

                }

            })
            //dump(self.usersArray)
             completion("FetchAllUsersKlar")

Этот код вообще не работает:

self.ref?.child("Users").observeSingleEvent(of: .value, with: { (DataSnapshot) in

                // Fetch users
                if let dictionary = snapshot.value as? [String: AnyObject] {
                    let user = User()
                    user.nameLabel = dictionary["Username"] as? String
                    user.occupationLocation = dictionary["Occupation"] as? String
                    user.ageLabel = dictionary["Age"] as? String
                    user.infoText = dictionary["Bio"] as? String
                    user.emailText = dictionary["email"] as? String

                    let email = user.emailText
                    let ref = Database.database().reference().child("Users")
                    ref.queryOrdered(byChild: "email").queryEqual(toValue: email).observeSingleEvent(of: .childAdded, with: { (snapshot) in
                        user.toId = snapshot.key

                    })

                            self.usersArray.append(user)

                }
                completion("FetchAllUsersKlar")
            })

Firebase выглядит так:

enter image description here

1 Ответ

0 голосов
/ 17 ноября 2018

Это пользовательская структура:

struct User{
    var id:String
    var username:String?
    var occupation:String?
    var age:Int?
    var bio:String?
    var email:String?
}

Вот запрос firebase, хотя я считаю, что декодирование объекта через Codable намного лучше, но ради того, чтобы придерживаться вашего примера, я проанализировал объект с помощью ключей.

let query = self.ref.child("Users").queryOrdered(byChild: "email")
    query.observeSingleEvent(of: .value) {
        (snapshot) in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let id = child.key
            let value = child.value as? NSDictionary
            let username = value?["Username"] as? String
            let occupation = value?["Occupation"] as? String
            let age = value?["Age"] as? Int
            let bio = value?["Bio"] as? String
            let email = value?["email"] as? String

            let user = User(id: id, username: username, occupation: occupation, age: age, bio: bio, email: email)

            self.usersArray.append(user)
        }
        completion("Users list fetched")
    }
...