gpt4 book ai didi

ios - Firebase 观察者事件类型

转载 作者:行者123 更新时间:2023-11-30 11:00:20 26 4
gpt4 key购买 nike

我正在尝试修改以前的程序员编写的代码。他编写了一个 getPostFromFirebase() 函数,在以下情况下更新表格 View :1) 应用程序由于存在于 viewDidLoad 中而加载,2) 当有新帖子添加时一个用户。问题是他使用了 .observe(.childAdded) 事件类型,这意味着当删除或修改帖子时,tableView 将不会更新(我的最终目标是这样做)。当我将 .childAdded 更改为 .value 时,当前数据在启动时不会加载。我一直在用头撞墙来找出一个 if let 语句来添加 .value 事件类型,以便 View 可以在任何更改后刷新(如果是的话)可能的)。我熟悉 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() 来删除当前状态并让 View 附加新的快照。无论添加还是删除帖子, View 现在都会按照我的意愿更新。

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 的情况下,这可能会更好,因为它允许您以最有效的方式处理每个单独的情况(新节点、更改、节点、删除节点)。

关于ios - Firebase 观察者事件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com