arrays - 使用 firebase 在 swift 中实现对提要帖子的评论

标签 arrays swift firebase object firebase-realtime-database

我正在尝试使用 swift 和 firebase 在我的应用程序中的每个提要帖子上实现一个评论部分,但是我在获取评论的代码上遇到了问题。在我的函数中,它返回一个空的 messageComments 数组,但我不知道我做错了什么。如果我希望我的 firebase 数据库结构看起来像图片中那样,我该如何实现将这些评论下载到数组中的代码?

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"


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

                    for comments in feedCommentsSnapshot {
                        commentArray.append((comments.childSnapshot(forPath: "comments").value as? messageComments!)!)
                    }
                })



                print("             comment:        ")
                print(commentArray)
                let messages = FeedMessages(content: content, color: color, icon: icon, comments: commentArray)
                feedMessagesArray.append(messages)
            }
            handler(feedMessagesArray)
        }
    }

Desired firebase database structure

最佳答案

如果您也有相同的数据结构,就不需要另一个评论请求,因为它们嵌套在提要消息中。这将只需要一些简单的解析,通过一些扩展可以使其更易于阅读和理解。

extension DataSnapshot {
    var string: String? {
        return value as? String
    }
    var childSnapshots: [DataSnapshot] {
        return children.allObjects as? [DataSnapshot] ?? []
    }
    func child(_ path: String) -> DataSnapshot {
        return childSnapshot(forPath: path)
    }
}

这两个扩展负责初始化对象所需的快照操作。

extension MessageComments {
    convenience init(snapshot: DataSnapshot) {
        self.comments = snapshot.childSnapshots.map { $0.string }
    }
}

extension FeedMessages {
    convenience init(snapshot: DataSnapshot) {
        self.color = snapshot.child("color").string ?? "bop",
        self.comments = MessageComments(snapshot: snapshot.child("comments"))
        self.content = snapshot.child("content").string ?? "Joe Flacco is an elite QB",
        self.icon = snapshot.child("icon").string ?? "none",
    }
}

只需映射子快照以将它们中的每一个初始化为 FeedMessages 对象。

func getFeedMessages(handler: @escaping (_ feedMessages: [FeedMessages]) -> ()) {
    REF_FEEDMESSAGES.observeSingleEvent(of: .value) {
        handler($0.childSnapshots.map { FeedMessages(snapshot: $0) })
    }
}

关于arrays - 使用 firebase 在 swift 中实现对提要帖子的评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572365/

相关文章:

c# - 使用一系列数字初始化一个 int 数组

ios - iOS应用中的排序数组问题

c++如何将数组传递给函数内部的函数

ios - 尝试后台刷新

ios - Swift - UISlider 的自定义控件

javascript - Firebase Cloud 消息传递仅发送 Web 应用程序的应用内消息

node.js - 如何在顶层使用参数化配置正确初始化自定义类实例?

C++ 代码在 GDB online 中有效,但在代码 :Blocks 中无效

flutter - 错误 : Method not found: 'FallThroughError' . 抛出 FallThroughError();

swift - 处理后退按钮 NavigationController 以推送到另一个 ViewController