处理Firebase数据的滑动到删除

时间:2017-03-20 14:17:38

标签: ios swift firebase firebase-realtime-database

我有一个函数来处理删除包含注释的表视图的行:

------------------
Hello World from Java code ... 
========================
callingMain0 ... 
------------------------
Hello World from Frege code ...
========================
callingMain1 ... 
------------------------
========================
callingMain2 ... 
------------------------
Hello World from Frege code ...
========================

使用此选项,注释将从表视图中删除,但由于它仍在我的数据库中,因此在再次加载表时会重新显示该注释。我试图弄清楚如何从数据库中删除选定的行/注释,同时从表中删除它。

我猜测我必须使用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { selectedPost.comments.remove(at: indexPath.row) selectedPost.commentAuthors.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .fade) // Remove from Firebase let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID) postsCommentsRef.observe(.childRemoved, with: { snapshot in // ?? self.tableView.reloadData() }) } } ,如上所示,但我不确定如何指定要在数据库中删除的确切注释。我理解从tableview中删除,因为我只是删除indexPath中的注释,它位于我的Post对象中的数组.childRemovedselectedPost.comment中。但是它们并没有保存在Firebase中的数组中。这是评论的添加方式:

selectedPost.commentAuthors

仍然习惯了Firebase,所以感谢任何帮助!

编辑(新):

新的tableview方法:

// Upload to Firebase
func addComment(comment: String) {
    let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
    var commentData:  [String: String] = [:]
    commentData["userId"] = FIRAuth.auth()!.currentUser!.displayName!
    commentData["comment"] = comment
    postsCommentsRef.childByAutoId().setValue(commentData)
}

// Listens for changes, appends arrays & uploads table view
func observePostComments() {
    let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
    postsCommentsRef.observe(.childAdded, with: { snapshot in
        let comment = snapshot.value as! [String: String]
        self.selectedPost.commentAuthors.append(comment["userId"]!)
        self.selectedPost.comments.append(comment["comment"]!)
        self.tableView.reloadData()
    })
}

观察帖子评论:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        let comment = selectedPost.comments[indexPath.row]
        selectedPost.comments.remove(at: indexPath.row)
        selectedPost.commentAuthors.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)

        // Remove from Firebase
        FIRDatabase.database().reference().child("postComments").child(self.postID).child(comment.key).removeValue()
    }
}

删除评论的观察者功能:

func observePostComments() {
    let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
    postsCommentsRef.observe(.childAdded, with: { snapshot in
        let comment = snapshot.value as! [String: String]
        comment.key = snapshot.key
        self.selectedPost.commentAuthors.append(comment["userId"]!)
        self.selectedPost.comments.append(comment["comment"]!)
        self.tableView.reloadData()
    })
}

1 个答案:

答案 0 :(得分:1)

所以,如果我理解这一点。 您用来删除评论的代码是不对的。

// Remove from Firebase
        let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
        postsCommentsRef.observe(.childRemoved, with: { snapshot in

            // ??

            self.tableView.reloadData()
        })

你在这里做的是创建一个观察者,当你从你设置的引用中删除某些内容时,它会侦听remove事件和触发器。这实际上并没有从firebase中删除任何内容。 你的想法是对的,但是如果你问我这个代码应该位于这个区域之外的某个地方。相反,您应该将此代码放在块中,以实际删除数据库中的注释:

FIRDatabase.database().reference().child("postComments").child(self.postID).removeValue()

将观察者放在viewDidLoad中的某个位置或为observePostComments()创建函数。当它触发时,你应该像你已经写过的那样打电话给self.tableView.reloadData()