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

Я пытаюсь перебрать информацию о пользователях и сохранить ее в объекте.

Вот мои данные

    {
  "users" : {
    "ApC2wS444YbEEUt5BOpFjkn7YTD3" : {
      "UserInfo" : {
        "lat" : 123123,
        "long" : 0,
        "petAge" : 5,
        "petNeme" : "zhshs"
      }
    },
    "doRJjseSogNJrCQ55zMGlJwj6jh2" : {
      "UserInfo" : {
        "UID" : "doRJjseSogNJrCQ55zMGlJwj6jh2",
        "lat" : 0,
        "long" : 0,
        "petAge" : 5,
        "petName" : "BBB"
      }
    }
  }
}

Мой код такой

ref = Database.database().reference()
tableView.delegate = self
tableView.dataSource = self

let userID = Auth.auth().currentUser?.uid
ref = Database.database().reference()

self.ref.child("users").observeSingleEvent(of: .value, with: { (snapshot) in
    // Get user value

    for child in snapshot.children.allObjects as! [DataSnapshot] {

        print(child.value)

        let value = snapshot.value as! NSDictionary
        let userInfo = value[0] as! NSDictionary
        let UID = userInfo["UID"] as! String
        let lat = userInfo["lat"] as! Double
        let long = userInfo["long"] as! Double
        let name = userInfo["petName"] as! String ?? ""
        let age = userInfo["petAge"] as! Double
    }

}) { (error) in
    print(error.localizedDescription)
}

Я не совсем понимаю, как мне обрабатывать снимки и как получить данныеправильно

Мне удалось получить один узел, но когда я пытаюсь пройти итерацию, он возвращает меня к одному и тому же узлу при каждой итерации

Любая помощь?

1 Ответ

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

В вашем примере вы используете в for цикле этот let userInfo = value[0] as! NSDictionary, который позже дает вам только первый узел: [0].

Также позвольте мне показать вам мой пример получения данных из моментального снимка (в моем случае у меня есть карты с autoId):

func loadDataFromDb(completion: @escaping ([Card])->()) {
        var cards: [Card] = []
        let userRef = getCurrentUserRef()
        usersRef.child(userRef).child(Paths.cards).observeSingleEvent(of: .value) { (snapshot) in
            for child in snapshot.children {
                if let snapshot = child as? DataSnapshot,
                    let card = Card(snapshot: snapshot) {
                    cards.append(card)
                }
            }
            completion(cards)
        }
    }

Также у меня есть failable init в Card:

private enum Constants {
    static let name = "name"
    static let barcode = "barcode"
}

final class Card {
    let name: String
    let barcode: String

    init(_ name: String, barcode: String) {
        self.name = name
        self.barcode = barcode
    }

    init?(snapshot: DataSnapshot) {
        guard let value = snapshot.value as? [String : AnyObject],
        let name = value[Constants.name] as? String,
        let barcode = value[Constants.barcode] as? String else {
            return nil
        }
        self.name = name
        self.barcode = barcode
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...