我正在尝试修改以前的程序员编写的代码。他编写了一个getPostFromFirebase()函数,该函数在以下情况下更新表视图:1)由于应用程序存在于viewDidLoad中而导致应用加载,以及2)用户添加了新帖子时。问题是他使用了.observe(.childAdded)事件类型,这意味着当帖子被删除或修改时,tableView将不会更新(我的最终目标是这样做)。当我将.childAdded更改为.value时,启动时不会加载当前数据。我一直在用力撞墙,以找出if let语句以添加.value事件类型,以便在进行任何更改后刷新视图(如果可能的话)。我对Firebase RT DB很熟悉,因此我能够识别观察者问题,但是我离我想取得的成就还差得很远,因此我们将不胜感激。

func getPostFromFirebase() {
    let mostRecent = dbRef.lastestPostsQuery(count: 10)
    mostRecent.keepSynced(true)
    mostRecent.observe(.childAdded) { (snapshot: DataSnapshot) in

      /*parse method in the PostFetcher class
      that returns the post data or an error by way of a tuple.*/

      let (post, error) = PostFetcher.parsePostSnapshot(snapshot: snapshot)
      if let post = post {
        self.latestPosts.append(post)
        if let postId = post.postId { print("PostId = \(postId)") }
      }
      if let error = error {
        print("\(#function) - \(error)")
      }
    }
  }


编辑:
感谢Franks的帮助,我得以实现他的建议,并添加了.removeAll()来删除当前状态并使视图附加新的快照。无论是添加还是删除帖子,视图现在都可以按照我的意愿进行更新。

func getPostFromFirebase() {
    let mostRecent = dbRef.lastestPostsQuery(count: 10)
    mostRecent.keepSynced(true)
    mostRecent.observe(.value) { (snapshot: DataSnapshot) in
        self.latestPosts.removeAll()
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let (post, error) = PostFetcher.parsePostSnapshot(snapshot: child)
            if let post = post {
                self.latestPosts.append(post)
                self.tableView.reloadData()
                if let postId = post.postId { print("PostId = \(postId)") }
            }
            if let error = error {
                print("\(#function) - \(error)")
            }
        }
    }
}

最佳答案

.child*事件在您观察到的位置/查询的子节点上触发,而.value事件在位置/查询本身上触发。这意味着您获得的值在JSON中比上一层高,并且您需要遍历结果:

mostRecent.observe(.value) { (snapshot: DataSnapshot) in
  for child in snapshot.children.allObjects as! [DataSnapshot] {
    let (post, error) = PostFetcher.parsePostSnapshot(snapshot: child)
    if let post = post {
      self.latestPosts.append(post)
      if let postId = post.postId { print("PostId = \(postId)") }
    }
    if let error = error {
      print("\(#function) - \(error)")
    }
  }
}


另外,您可以侦听.childChanged.childRemoved事件(除了已有的.childAdded之外)并分别处理它们。这在需要有效更新UI的情况下可能会更好,因为它允许您以最有效的方式处理每种情况(新节点,已更改,节点,已删除节点)。

10-08 07:44
查看更多