2017-02-28 4 views
0

私はその投稿に投稿とコメントを持つアプリを作っています。しかし、ユーザーが投稿/コメントを投稿するたびに、UITableViewに読み込まれた後に投稿された順に表示されません。投稿とコメントにタイムスタンプを実装しましたが、どのように並べ替えるのか分かりません。Firebaseデータベースを年代順に並べ替えるにはどうしたらいいですか?

マイデータベース:

"posts" : { 
    "47CCC57D-9056-4F5B-919E-F686065574A2" : { 
    "comments" : { 
     "99838A46-A84E-47E9-9D9C-E048543DC7C9" : { 
      "comment" : "Would you trade for a red one?", 
      "timestamp" : 1488315280579, 
      "commentID" : "99838A46-A84E-47E9-9D9C-E048543DC7C9", 
      "username" : "user" 
     } 
    }, 
    "description" : "Don't really need this anymore. Willing to go for less if I can get a trade", 
    "image" : "JLMzSuhJmZ.jpeg", 
    "postID" : "47CCC57D-9056-4F5B-919E-F686065574A2", 
    "price" : "$5", 
    "rating" : "8", 
    "title" : "title", 
    "uid" : "5U1TnNtkhegmcsrRt88Bs6AO4Gh2", 
    "username" : "user" 
}, 

がどのように私はCommentViewControllerにコメントをソートするatttemptingています:

var postDetails: String? 
var posts = NSMutableArray() 

func loadData() { 
    FIRDatabase.database().reference().child("posts").child(postDetails!) 
       .child("comments").queryOrdered(byChild: "timestamp") 
       .observeSingleEvent(of: .value, with: { snapshot in 
       if let postsDictionary = snapshot.value as? [String: AnyObject] { 
        for post in postsDictionary { 
         self.posts.add(post.value) 
        } 
        self.tableView.reloadData() 
       } 
    }) 
} 


// Displays posts in postsDetailsTableView 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "commentCell", for: indexPath) as! CommentTableViewCell 
     // Configure the cell... 
     let post = self.posts[indexPath.row] as! [String: AnyObject] 
     cell.selectionStyle = .none 
     cell.commentLabel.text = post["comment"] as? String 
     cell.usernameLabel.text = post["username"] as? String 
     return cell 
    } 
} 

私は各コメントは、それが投稿された順になるように何ができるの?

答えて

0

問題:コードでは、スナップショットを返していますが、順序を失う辞書に変換しています。

.valueを使用してクエリを実行すると、順序に関するキー、値、および情報がスナップショットに含まれますが、スナップショットが辞書に変換されると順序が失われ、正しい順番を得るために子を反復処理する必要があります。

func loadData() { 
    FIRDatabase.database().reference().child("posts").child(postDetails!) 
       .child("comments").queryOrdered(byChild: "timestamp") 
       .observe(.value, with: { snapshot in 

       for child in snapshot.children { 
       print("child \(child)") 
       } 
    }) 
} 
+0

ありがとうございます。 'func loadData'をあなたの例で置き換えるべきですか、あるいは既存の関数にコードを追加すべきですか?いずれかの方法で – gabe

+0

@gabe明らかに正しい順序を示すためのprint文を削除し、配列に必要なものを追加するコードに置き換える必要があります。そのループが完了したら、self.tableView.reloadData()を実行します。キーは正しい順序を維持するためにsnapshot.childrenを反復処理しています。 – Jay

関連する問題