Как получить и использовать данные из снимка Firebase после создания postDict;я получаю "0 \ 0 \ 0" - PullRequest
0 голосов
/ 05 декабря 2018

Я посмотрел несколько вопросов и примеров, но безрезультатно.Подход, который я использую для отображения массива постов, «должен работать» из того, что я вижу, но по какой-то причине я не могу получить доступ к паре ключ / значение внутри данных моего снимка ...

В приведенном ниже коде я могу создать postDict, и я вижу все данные, которые мне нужны, однако я не могу назначить значение userID, вместо проходящего через строку значения, я вижу следующее в консоли отладки: userID =(Строка) "\ ​​0 \ 0 \ 0"

Есть идеи?Спасибо!

static func allPosts(completion: @escaping ([Post]) -> Void) {
    let postRef = Database.database().reference().child("posts")

    postRef.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let snapshot = snapshot.children.allObjects as? [DataSnapshot]
            else { return completion([]) }

        let dispatchGroup = DispatchGroup()

        var posts = [Post]()

        for postSnap in snapshot {

            guard let postDict = postSnap.value as? [String : AnyObject],
                let userID = postDict["userID"] as? String

                else { continue }

            dispatchGroup.enter()

            PostFirebase.getPostByKey(postKey: postSnap.key, userID: userID, completion: { (post) in
                if let post = post {
                    posts.append(post)

                    print("posts array = \(posts)")
                }

                dispatchGroup.leave()
            })
        }

        dispatchGroup.notify(queue: .main, execute: {
            completion(posts.reversed())
        })
    })
}

Вот экспорт JSON из /posts:

{
  "Tzgb6023LzYV8lVJr3KHbosdtR72" : {
    "-LQEw9M7DPZ0XugHdd7e" : {
      "noCount" : 0,
      "photoURL" : "https://firebasestorage.googleapis.com/...",
      "postText" : "soAwesome",
      "timestamp" : 5.62779748747864E8,
      "userID" : "Tzgb6023LzYV8lVJr3KHbosdtR72",
      "userPhotoURL" : "https://firebasestorage.googleapis.com/....",
      "username" : "ninjaone ",
      "videoURL" : "https://firebasestorage.googleapis.com/....",
      "voteCount" : 2,
      "yesCount" : 2
    }
  }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Из JSON кажется, что у вас есть два динамических уровня ниже /posts.Я предполагаю, что первый уровень - это UID пользователя, создавшего сообщение, а уровень под ним - это идентификатор сообщения (сгенерированный путем вызова childByAutoId).

Ваш код, однако, зацикливается только на первомуровень (UID), а затем пытается прочитать сообщения.Это не сработает, конечно, потому что есть другой динамический уровень ниже.Таким образом, вам понадобятся два (вложенных) цикла:

let postRef = Database.database().reference().child("posts")

postRef.observeSingleEvent(of: .value, with: { (snapshot) in
    guard let snapshot = snapshot.children.allObjects as? [DataSnapshot]
        else { return completion([]) }

    let dispatchGroup = DispatchGroup()

    var posts = [Post]()

    for userSnap in snapshot {
      guard let postSnapshots = userSnap.children.allObjects as? [DataSnapshot]

      for postSnap in postSnapshots {

        guard let postDict = postSnap.value as? [String : AnyObject],
            let userID = postDict["userID"] as? String

            else { continue }

        dispatchGroup.enter()

        PostFirebase.getPostByKey(postKey: postSnap.key, userID: userID, completion: { (post) in
            if let post = post {
                posts.append(post)

                print("posts array = \(posts)")
            }

            dispatchGroup.leave()
        })
      }
    }

    dispatchGroup.notify(queue: .main, execute: {
        completion(posts.reversed())
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...