gpt4 book ai didi

ios - Firebase 快照顺序错误

转载 作者:搜寻专家 更新时间:2023-10-30 23:38:05 24 4
gpt4 key购买 nike

我尝试将存储在 firebase 上的帖子加载到我的 tableView 中。我使用 .childAdded 函数按照发布顺序(从前到后)获取帖子。起初它似乎工作,但现在它不再工作,我不知道为什么。所以我在帖子中添加了时间戳并使用了 queryOrderedByChild("timestamp")。虽然仍然是错误的顺序!这是我的代码:

posts.removeAll()
let ref = FIRDatabase.database().reference()

ref.child("Posts").queryOrderedByChild("timestamp").observeEventType(.ChildAdded, withBlock: { (snapshot:FIRDataSnapshot) in

print(snapshot.value!["timestamp"] as! Int)
if snapshot.value == nil {
return
}
let post = Post()
post.title = snapshot.value!["Title"] as? String
post.postType = snapshot.value!["postType"] as? Int
post.postDescription = snapshot.value!["Description"] as? String

if post.postType == 2 {
post.imageAURL = snapshot.value!["imageAURL"] as? String
post.imageBURL = snapshot.value!["imageBURL"] as? String
}else if post.postType == 3 {
post.imageAURL = snapshot.value!["imageAURL"] as? String
post.imageBURL = snapshot.value!["imageBURL"] as? String
post.imageCURL = snapshot.value!["imageCURL"] as? String
}


let createdByID = snapshot.value!["createdBy"] as! String
var username = String()
let usernameRef = FIRDatabase.database().reference().child("users").child(createdByID)
usernameRef.observeSingleEventOfType(.Value, withBlock: { (snapshot:FIRDataSnapshot) in

username = snapshot.value!["username"] as! String
post.createdBy = username
self.posts.append(post)
self.tableView.reloadData()
}, withCancelBlock: nil)




dispatch_async(dispatch_get_main_queue(), {

self.tableView.reloadData()
})


}, withCancelBlock: nil)


}

查询开头的时间戳值的打印输出:

1471008028
1471007899
1471007928
1471007979

可以看到,第一个Int是最高的,后面三个按升序排列正确,但是为什么最高的是first而不是last呢?我不知道它是否与它有任何关系,但代码在 viewDidLoad 内部调用的函数中。

最佳答案

有一个现有的 answer这解释了为什么 Firebase JavaScript child_added 事件发生乱序。它仍然适用,并且是您的快照以意外顺序交付的原因。

I know this may seem strange, but this is actually the intended behavior.

In order to guarantee that local events can fire immediately without communicating with the server first, Firebase makes no guarantees that child_added events will always be called in sort order.

要将收到的快照排列成正确的顺序,您需要快照附带的前一个同级键(在引用的答案中称为 prevChildName)。要获取之前的同级键,需要使用observeEventType:andPreviousSiblingKeyWithBlock: .

observeEventType:andPreviousSiblingKeyWithBlock: 的 Firebase 文档没有明确说明应该如何使用先前的同级键来排列接收到的快照。

为了示例的目的,要在数组中存储和排序快照,您需要为每个接收到的快照执行以下操作:

  • 如果接收到的快照有一个空的previous sibling key,将其添加到数组的头部;
  • 否则,在数组中找到具有key 的快照等于前一个兄弟键(伴随接收到的快照)并将接收到的快照插入到找到的快照之后的数组中;
  • 如果没有与前一个兄弟键的快照,则将接收到的快照添加到数组的尾部。

关于ios - Firebase 快照顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38919385/

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