Получение вложенных данных в firebase с помощью swift - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь реализовать комментарии к сообщениям в моем приложении, но у меня возникают проблемы с получением вложенных данных, называемых "комментариями" в сообщении. Если моя структура базы данных Firebase выглядит как на картинке, как я могу правильно загрузить комментарии в виде массива messageComments?

func getFeedMessages(handler: @escaping (_ feedMessages:[FeedMessages]) -> ()){
        var feedMessagesArray = [FeedMessages]()
        var commentArray = [messageComments]()


        REF_FEEDMESSAGES.observeSingleEvent(of: .value) { (feedMessagesSnapshot) in

            guard let feedMessagesSnapshot = feedMessagesSnapshot.children.allObjects as? [DataSnapshot] else {return}
            for messages in feedMessagesSnapshot {

                let content = messages.childSnapshot(forPath: "content").value as? String ?? "Joe Flacco is an elite QB"
                let icon = messages.childSnapshot(forPath: "icon").value as? String ?? "none"
                let color = messages.childSnapshot(forPath: "color").value as? String ?? "bop"
                let date = messages.childSnapshot(forPath: "date").value as? String ?? "0"
                let comments = messages.childSnapshot(forPath: "comments").value as? [messageComments] ?? []
                let userName = messages.childSnapshot(forPath: "userName").value as? String ?? "Anonymous"

                let messages = FeedMessages(content: content, color: color, icon: icon, date: date, comments: comments, userName: userName)
                feedMessagesArray.append(messages)
            }

            handler(feedMessagesArray)
        }
    }

enter image description here

Ответы [ 2 ]

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

вот решение

let comments = messages.childSnapshot(forPath: "comments").value as? [String: Any] ?? [:]



                for comment in comments {

                    let theComment = comment.value as? [String: Any]

                    let theContent = theComment?["content"] as? String ?? ""
                    let theIcon = theComment?["icon"] as? String ?? ""
                    let theColor = theComment?["color"] as? String ?? ""
                    let theDate = theComment?["date"] as? String ?? ""
                    let theName = theComment?["userName"] as? String ?? ""

                    let aComment = messageComments(content: theContent, color: theColor, icon: theIcon, date: theDate,  userName: theName)
                    commentArray.append(aComment)
                }
0 голосов
/ 17 ноября 2018

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

let comments = messages.childSnapshot(forPath: "comments").value as? [String: Any]
let comment1 = comments?["comment1"] as? String ?? "comment1"
let comment2 = comments?["comment2"] as? String ?? "comment2"

Затем вам нужно инициализировать ваш объект messageComments, обычно вызывая вашmessageComments инициализатор.Также я бы порекомендовал начинать имена классов с заглавной буквы.

Редактировать : для загрузки комментариев вручную я бы порекомендовал:

if let comments = comments { 
    for comment in comments.values {
       // here your access your comment as you want, you need to cast as string
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...