2016-08-04 51 views
2

當我將以下Firebase數據庫數據加載到我的tableView中時,數據按日期升序排序。我怎樣才能以降序排列(顯示最上面的帖子)?在swift中的Firebase查詢排序順序?

查詢在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({$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 
    } 
} 
+1

您使用queryOrderedByChild的意思是你期待的數據被那爲什麼預購你是手動排序嗎? –

+1

您正在重載'cellForRowAtIndexPath'中的表格視圖!這將在崩潰中結束! –

回答

9

當火力地堡將數據加載到您的tableView數據源陣列,稱之爲:

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

斯威夫特3版本:

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

感謝您的回覆!我得到錯誤'類型'FIRDataSnapshot'的值沒有成員'date''。更新了我的代碼 – winston

+0

啊好的。這是我的建議。創建一個名爲Post的新自定義類(應該不超過5分鐘),其屬性爲「date」,「postingBy」和「status」。您的self.posts數組將成爲Post對象的數組,然後排序數組就沒有問題。雖然看起來有很多工作要做,但將自定義類與Firebase數據對象關聯起來會讓您的生活更輕鬆,尤其是在路上。 – Bawpotter

+0

我用新的Post類更新了這個問題。我使用Firebase文檔中的一些示例代碼作爲參考。我現在該如何指出我的self.posts數組來查看這個新類? – winston

1

雖然我不建議做什麼被張貼和創建一個類,並以這種方式,我會給你另一種方式來做排序。

既然你已經把它從火力地堡升序排序,你知道的記錄數,你可以這樣做:

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