swift 中的 Firebase 查询排序顺序?

Firebase query sort order in swift?

当我将以下 Firebase 数据库数据加载到我的 tableView 中时,数据按日期升序排序。如何按降序排列(在顶部显示最新的 post)?

在Xcode中查询:

let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in

JSON 出口:

"posts" : {
    "-KMFYKt7rmfZINetx1hF" : {
      "date" : "07/09/16 12:46 PM",
      "postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
      "status" : "test"
    },
    "-KMFYZeJmgvmnqZ4OhT_" : {
      "date" : "07/09/16 12:47 PM",
      "postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
      "status" : "test"
    },

谢谢!!

编辑:感谢 Bawpotter

,下面的代码是完整的解决方案

更新查询:

let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in

    let post = Post.init(key: snapshot.key, date: snapshot.value!["date"] as! String, postedBy: snapshot.value!["postedBy"] as! String, status: snapshot.value!["status"] as! String)

    self.posts.append(post)

    self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.posts.count-1, inSection: 0)], withRowAnimation: .Automatic)

tableView cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("PostCell", forIndexPath: indexPath) as! PostCell

        self.posts.sortInPlace({[=14=].date > .date})
        self.tableView.reloadData()

Post.swift:

import UIKit

class Post {
    var key: String
    var date: String
    var postedBy: String
    var status: String

    init(key: String, date: String, postedBy: String, status: String){
        self.key = key
        self.date = date
        self.postedBy = postedBy
        self.status = status
    }
}

当 Firebase 将数据加载到您的 tableView 数据源数组时,请调用:

yourDataArray.sortInPlace({[=12=].date > .date})

Swift 3 版本:

yourDataArray.sort({[=10=].date > .date})

Swift 4 版本:

yourDataArray.sort(by: {[=11=].date > .date})

虽然我确实建议按照张贴的内容创建一个 Class 并按照这种方式进行,但我会给你另一种方法来对它进行排序。

由于您已经从 Firebase 中按升序对其进行了排序并且您知道记录的数量,因此您可以这样做:

guard let value = snapshot.children.allObjects as? [FIRDataSnapshot] else {
                    return
}
var valueSorted: [FIRDataSnapshot] = [FIRDataSnapshot]()
var i: Int = value.count
while i > 0 {
    i = i - 1
    valueSorted.append(value[i])
}

只需在使用数据

之前使用.reverse()

示例:

myRef.observe(.value) { (snapshot) in
    guard var objects = snapshot.children.allObjects as? [DataSnapshot] else {
        return
    }
    
    objects.reverse() //<========= HERE
    
    //Now use your `objects`
    ...
}

Swift 5: 按必填字段排序后,将 reversed() 添加到您的对象中。 例如,假设您在 FireStore 的“日”字段中有一个月中的某一天。 像这样的事情就可以了(在 viewDidLoad 中调用 loadData() 函数来查看输出):

let db = Firestore.firestore()
func loadData() {
        db.collection("FireStoreCollectionName").order(by: "day").getDocuments { (querySnapshot, error) in
            if let e = error {
                print("There was an issue retrieving data from Firestore, \(e)")
            } else {
                for document in querySnapshot!.documents.reversed() {
                    let data = document.data()
                    let fDay = data["day"] as! Int
                    print(fDay)                                       
                }
            }
        }
    }