使用Firebase快速在Feed帖子上实施评论

时间:2018-09-29 20:38:45

标签: 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

1 个答案:

答案 0 :(得分:1)

如果您也具有相同的数据结构,则由于它们嵌套在提要消息中,因此无需其他请求注释。只需进行一些简单的分析,并通过一些扩展使其更易于阅读和理解。

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) })
    }
}