按降序过滤时向 Firebase 观察者添加新帖子

Posted

技术标签:

【中文标题】按降序过滤时向 Firebase 观察者添加新帖子【英文标题】:Adding New Posts to Firebase observer when filtering by descending time 【发布时间】:2016-10-09 17:42:48 【问题描述】:

所以我有一个供用户发布的提要,并希望每个新提交的内容都位于我的收藏视图的顶部。我使用此处显示的 UTC 时间的负值按时间降序排列每个新帖子:How do you properly order data from Firebase chronologically。

    "Posts" : 
      "-KHLOy5mOSq0SeB7GBXv" : 
           "timestamp" : "1476028495915",
           "descendStamp": "-1476028495915"
           "otherData": ""
       ,
      "-KHLrapS0wbjqPP5ZSUY" : 
           "timestamp" : "1476028496102"
           "descendStamp" : "-1476028496102"
           "otherData": ""
       ,

但是,添加的每个新实时帖子在最初加载时都会放在底部。相信这是因为观察者只是异步加载新添加的孩子,而不是再次下载任何其他信息,这导致它忽略了我的

    .queryOrderedByChild("descendStamp")

离开并返回视图后,它会将最近添加的帖子正确组织到顶部。我是否需要客户端过滤才能实时将这些新帖子放在顶部?或者,随着新帖子的出现,重新组织帖子顺序的最佳方法是什么?

    var posts = [PostModel]()

    let postQuery = ref.child("Posts").queryOrderedByChild("descendStamp")
        postQuery.observeEventType(.ChildAdded, withBlock:  (snap) in


            if snap.exists() 
                let postData = snap.value! as! [String: AnyObject]

                let post = PostModel()

                post.timestamp = postData["timestamp"] as? NSTimeInterval
                post.descendStamp = postData["descentStamp"] as? NSTimeInterval
                post.otherData = postData["otherData"] as? String

                self.posts.append(post)

                dispatch_async(dispatch_get_main_queue(), 
                    self.collectionView!.reloadData()
                )
            

【问题讨论】:

【参考方案1】:

只需在更新 tableView 之前对数据源进行排序。

self.posts.sort(by: $0.descendStamp > $1.descendStamp)

您的代码将如下所示:-

var posts = [PostModel]()

let postQuery = ref.child("Posts").queryOrderedByChild("descendStamp")
    postQuery.observeEventType(.ChildAdded, withBlock:  (snap) in


        if snap.exists() 
            let postData = snap.value! as! [String: AnyObject]

            let post = PostModel()

            post.timestamp = postData["timestamp"] as? NSTimeInterval
            post.descendStamp = postData["descentStamp"] as? NSTimeInterval
            post.otherData = postData["otherData"] as? String

            self.posts.append(post)
            self.posts.sort(by: $0.descendStamp > $1.descendStamp)

            dispatch_async(dispatch_get_main_queue(), 
                self.posts.sort(by: $0.descendStamp > $1.descendStamp)
                self.collectionView!.reloadData()
            )
        

【讨论】:

我就不能这样排序,因为它是一本字典吗?也是 swift 3 的语法。我目前正在使用 swift 2.3 什么是PostModel?不是结构体吗? 不,这是我的模型邮政单元格的一个类。这有什么不同吗? 这行不行?如果不行,将您的 PostModel 类转换为结构。 我将其更改为结构,但仍不确定如何将帖子从字典更改为允许您在答案中提到的排序

以上是关于按降序过滤时向 Firebase 观察者添加新帖子的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 按降序对数据进行排序。 (只排序了一半。)

如何在 Firebase 中按降序排列数据 - Python

如何在Android Firebase实时数据库中按降序获取孩子[重复]

WP-API 获取帖子并按降序排列

在 Swift 中将项目添加到 Firebase 数组而不首先观察数组

将字典值按降序排序[重复]