2016-08-04 13 views
2

次のFirebaseデータベースデータをtableViewにロードすると、日付順にデータがソートされます。降順でこれを注文するにはどうすればよいですか(最上部に最新の投稿を表示します)? Xcodeで迅速なFirebaseクエリの並べ替え順序?

問合せ:

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

FirebaseがあなたのtableViewデータソース列にデータをロードし、これを呼び出す:

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

スウィフト3バージョン:私はお勧めんが何を

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

返事をありがとう!エラー 'タイプの値' FIRDataSnapshot 'にメンバー' date 'がありません。私のコードを更新しました – winston

+0

ああ。ここに私がお勧めするものがあります。 「date」、「postedBy」、および「status」のプロパティを持つPostという新しいカスタムクラスを作成します(5分以上かかることはありません)。あなたのself.posts配列はPostオブジェクトの配列になり、配列のソートには問題ありません。 Firebaseのデータオブジェクトに関連付けられたカスタムクラスを使用すると、特に道のりをはるかに簡単にすることができます。 – Bawpotter

+0

新しいPostクラスで質問を更新しました。 Firebaseのドキュメントのサンプルコードを参考にしました。 self.posts配列がその新しいクラスを見えるようにするにはどうしたらいいですか? – winston

1

をやってクラスが作成され、そのように実行されると、別の方法で並べ替えることができます。あなたはすでにそれが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]) 
} 
関連する問題