2016-08-04 18 views
2

Wenn ich die folgenden Firebase-Datenbankdaten in meine TableView lade, werden die Daten in aufsteigender Reihenfolge nach Datum sortiert. Wie kann ich dies absteigend (zeige den neuesten Beitrag oben) bestellen?Firebase Abfrage Sortierreihenfolge in swift?

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

Dank !!

EDIT: Unten-Code ist die gesamte Dank Lösung

Aktualisiert Abfrage 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({$0.date > $1.date}) 
     self.tableView.reloadData() 

Post.swift :

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

Swift 3 Version:

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 
    } 
} 
+1

Sie queryOrderedByChild verwenden meinen Sie Daten erwarten dann werden vorbestellt warum sortieren Sie manuell? –

+1

Sie laden die Tabellenansicht in 'cellForRowAtIndexPath' neu! Dies wird mit einem Absturz enden! –

Antwort

9

Wenn Firebase die Daten in Ihre Tableview Datenquelle Array lädt, diese nennen

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

Danke für die Antwort! Ich erhalte den Fehler 'Wert des Typs 'FIRDataSnapshot' hat kein Mitglied 'Datum'. Aktualisierte meinen Code – winston

+0

Ah okay. Hier ist, was ich empfehlen würde. Erstellen Sie eine neue benutzerdefinierte Klasse (sollte nicht länger als 5 Minuten dauern), Post genannt, mit den Eigenschaften "date", "postedBy" und "status". Ihr self.posts-Array wird zu einem Array von Post-Objekten, und dann haben Sie kein Problem, das Array zu sortieren. Es mag zwar eine Menge Arbeit sein, aber eine benutzerdefinierte Klasse, die mit Ihren Firebase-Datenobjekten verbunden ist, wird Ihr Leben VIEL einfacher machen, besonders im weiteren Verlauf. – Bawpotter

+0

Ich habe die Frage mit meiner neuen Post-Klasse aktualisiert. Ich habe einen Beispielcode aus den Firebase-Dokumenten als Referenz verwendet. Wie kann ich jetzt mein self.posts-Array auf diese neue Klasse zeigen? – winston

1

Während ich, was zu tun empfehlen wurde gepostet und erstellt eine Klasse und mache es so, ich gebe dir eine andere Möglichkeit, es zu sortieren.

Da Sie bereits haben es in absteigender Reihenfolge von Firebase sortiert und Sie wissen, die Menge der Datensätze, können Sie dies tun:

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