当前位置: 首页 > 面试题库 >

如何按时间顺序从Firebase正确订购数据

苏昂雄
2023-03-14
问题内容

我正在尝试从Firebase订购数据,因此最近的帖子位于顶部(如Instagram),但我无法使其正常运行。我应该使用服务器时间戳吗?是否有一个“
createdAt”字段?

func getPosts() {
    POST_REF.observeEventType(.Value, withBlock: { snapshot in
        guard let posts = snapshot.value as? [String : [String : String]] else {
            print("No Posts Found")
            return
        }

        Post.feed?.removeAll()
        for (postID, post) in posts {
            let newPost = Post.initWithPostID(postID, postDict: post)!
            Post.feed?.append(newPost)
        }
        Post.feed? = (Post.feed?.reverse())!
        self.tableView.reloadData()
        }, withCancelBlock: { error in
            print(error.localizedDescription)
    })
}

问题答案:

仅对数组使用 reverse() 不足以包含所有内容。您需要考虑不同的事情:

  • 在检索数据时进行限制,请使用 append() ,然后使用 reverse() 可以节省时间。您不需要每次都删除所有数组。

  • 滚动触发器willDisplay单元格方法 加载

开始吧。您可以为帖子的 时间戳记日期/时间创建 全局子对象。为了提供类似 Instagram的 秒数,我建议您使用
UTC时间 。因此,我将其称为:( timeUTC

要对所有帖子进行排序,请使用 1970年以来的 时间戳。因此,我将其称为( timestamp
),然后您还可以将另一个节点保留为(reversedTimestamp)添加-时间戳的前缀。因此,当您使用 queryOrdered
到此节点时。您可以使用来处理最新的5个帖子yourQuery.queryLimited(toFirst: 5)

1,在Swift 3中获取timeUTC节点的UTC日期/时间

        let date = Date()
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
        formatter.timeZone = TimeZone(abbreviation: "UTC")
        let utcTimeZoneStr = formatter.string(from: date)

+0000表示世界通用时间,请访问http://time.is/tr/UTC

2.获取1970年以来的时间戳,以对Swift 3中的帖子进行排序:

let timestamp = (Date().timeIntervalSince1970 as NSString).doubleValue
let reversedTimestamp = -1.0 * timestamp

现在,您可以像这样将它们保存在Firebase帖子中。

"posts" : {
    "-KHLOy5mOSq0SeB7GBXv" : {
      "timestamp": "1475858019.2306"
      "timeUTC" : "2012-02-04 12:11:56 +0000"
    },
    "-KHLrapS0wbjqPP5ZSUY" : {
      "timestamp": "1475858010.1245"
      "timeUTC" : "2014-02-04 12:11:56 +0000"
    },

我将五个职位检索五,所以我做 queryLimited(toFirst:5)viewDidLoad

let yourQuery = ...queryOrdered(byChild: "reverseTimestamp")
                   .queryEnding(atValue: "\(self.pageOnTimestamp)", childKey: "reverseTimestamp")

    yourQuery.observeSingleEvent(of: .value, with: { (snapshot) in

        if snapshot.value is NSNull {

            print("There is no post.")

        }
        else {

            yourQuery.queryLimited(toFirst: 5).observeSingleEvent(of: .value, with: { (snapshot) in

                self.posts.removeAll(keepingCapacity: true)

                for (i, snap) in snapshot.children.enumerated() {

                    if let postAllDict = snapshot.value as? [String: AnyObject] {
                        if let postDict = postAllDict[(snap as AnyObject).key as String] as? [String: AnyObject] {

                            let post = Post(key: (snap as AnyObject).key as String, postDict: postDict)
                            self.posts.append(post)
                        }
                    }
                }

                completion(true)
            })
        }
    })

如果用户到达了最新帖子,则可以使用willDisplay以下方法处理它,然后可以调用loadMore函数。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

   if self.posts.count - 1 == indexPath.row {
      // call loadMore function.
   }
}

在loadMore()函数中,您可以处理最新文章的时间戳,然后像这样进行开始-结束查询,因此您可以轻松地继续下一个前5个文章,同时在数组之前追加。



 类似资料:
  • 问题内容: 我正在使用Firebase,直到最近我都没有按字母顺序获取数据的问题。我从来没有使用过查询,我总是只使用数据快照并逐一对其进行排序。最近,在 snapVal中 ,数据并不总是按字母顺序 排列 。如何做到这一点,以便获得按字母顺序排序的数据的snapVal,就像数据库快照中的快照一样? 真实示例:有4条消息,id1-id4(按此顺序)。它们包含消息“ 1”-“ 4”。快照看起来正确。但是

  • 我有一个应用程序,它试图动态构建一条Javamail消息,组装邮件时可用的Mime正文部分。每个图像的顶部都有一个“GPC”图像,后面是一些HTML文本(正文),一个由HTML构建的结束语,一个结束语“品牌”图像,以及结束语的最后一部分,也是HTML。文件附件可能包括,也可能不包括。如果适用,错误免责声明(HTML)可能会出现在第一张图片之前。 免责声明,正文,结尾, 我搞不懂。在我看来,“父”多

  • 是否可以从TestNG中按时间顺序获得? 我的测试类和方法都显示得乱七八糟。 我知道按时间顺序排序,但我也希望emailable-report.html中有一个按时间顺序排列的视图

  • 我有一张日期表 我想按时间顺序点菜。我发现另一个线程推荐使用: 但输出不能正确地将最新的排序为最旧的。