Firebase query sort order in swift?

12,111

Solution 1

When Firebase loads the data into your tableView data source array, call this:

yourDataArray.sortInPlace({$0.date > $1.date})

Swift 3 Version:

yourDataArray.sort({$0.date > $1.date})

Swift 4 Version:

yourDataArray.sort(by: {$0.date > $1.date})

Solution 2

While I do recommend doing what was posted and creating a Class and doing it that way, I will give you another way to do sort it.

Since you already have it sorted in Ascending order from Firebase and you know the amount of records, you can do this:

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])
}

Solution 3

Simply use .reverse() before using data

Example:

myRef.observe(.value) { (snapshot) in
    guard var objects = snapshot.children.allObjects as? [DataSnapshot] else {
        return
    }
    
    objects.reverse() //<========= HERE
    
    //Now use your `objects`
    ...
}
Share:
12,111
winston
Author by

winston

Updated on July 13, 2022

Comments

  • winston
    winston almost 2 years

    When I load the following Firebase Database data into my tableView, the data is sorted in ascending order by date. How can I order this by descending (show the newest post at the top)?

    Query in Xcode:

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

    JSON export:

    "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"
        },
    

    Thanks!!

    EDIT: Below code is the entire solution thanks to Bawpotter

    Updated query:

    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({$0.date > $1.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
        }
    }