質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

767閲覧

タイムラインを投稿順に表示したい!! [FIrebase]

masaboy

総合スコア61

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/02/28 19:49

編集2022/02/28 19:53

タイムラインに投稿順に表示したい!!

https://qiita.com/fummicc1_dev/items/b4975f64b9f3f2bd46ca
を元にFirebaseの勉強をしているのですが、現時点のコードだと投稿がランダムに表示されてしまいます。

発生している問題

自分なりの考察としましては、PostにあるcreatedAtを比較してその順番にsortし、配列として表示すればいいのではないかと思っているのですが、createdAtの比較の仕方がわからずに質問することにしました。

自分がやったこと

1.createdAtをDate型に変換→比較する→createdAtのDate型への変換がわからない

2・createdAtを比較出来るのか→viewWillAppear内で

Swift

1postArray.sort { $0.createdAt < $1.createdAt }

を入力するとエラー

Swift

1Referencing operator function '<' on 'Comparable' requires that 'Timestamp' conform to 'Comparable'

が出る→Comparableの設定の方法がわからない

該当のソースコード

以下に必要と思われるコードを載せます。

Swift.Post

1import Foundation 2import Firebase 3 4struct Post { 5 let content: String 6 let postID: String 7 let senderID: String 8 let createdAt: Timestamp 9 let updatedAt: Timestamp 10 11 init(data: [String: Any]) { 12 content = data["content"] as! String 13 postID = data["postID"] as! String 14 senderID = data["senderID"] as! String 15 createdAt = data["createdAt"] as! Timestamp 16 updatedAt = data["updatedAt"] as! Timestamp 17 } 18}

Swift.AppUser

1import Foundation 2import Firebase 3 4struct AppUser { 5 let userID: String 6 let userName: String 7 8 init(data: [String: Any]) { 9 userID = data["userID"] as! String 10 userName = data["userName"] as? String ?? "匿名" 11 } 12} 13

Swift.TimelineViewController

1import UIKit 2import Firebase 3 4class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 6 @IBOutlet var tableView: UITableView! 7 8 var me: AppUser! 9 var database: Firestore! 10 var postArray: [Post] = [] 11 12 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 database = Firestore.firestore() 17 tableView.delegate = self 18 tableView.dataSource = self 19 20 let press = UILongPressGestureRecognizer(target: self, action: #selector(pressScreen)) 21 press.minimumPressDuration = 1.5 22 view.isUserInteractionEnabled = true 23 view.addGestureRecognizer(press) 24 } 25 26 override func viewWillAppear(_ animated: Bool) { 27 super.viewWillAppear(animated) 28 database.collection("posts").getDocuments { (snapshots, error) in 29 if error == nil, let snapshots = snapshots { 30 self.postArray = [] 31 for document in snapshots.documents { 32 let data = document.data() 33 let post = Post(data: data) 34 self.postArray.append(post) 35 } 36 self.tableView.reloadData() 37 } 38 } 39 40 database.collection("users").document(me.userID).setData([ 41 "userID": me.userID 42 ], merge: true) 43 44 database.collection("users").document(me.userID).getDocument { (snapshot, error) in 45 if error == nil, let snapshot = snapshot, let data = snapshot.data() { 46 self.me = AppUser(data: data) 47 } 48 } 49 } 50 51 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 52 if segue.identifier == "Add" { 53 let destination = segue.destination as! AddViewController 54 destination.me = sender as! AppUser 55 } else if segue.identifier == "Settings" { 56 let destination = segue.destination as! SettingsViewController 57 destination.me = me 58 } 59 } 60 61 @objc func pressScreen() { 62 performSegue(withIdentifier: "Settings", sender: me) 63 } 64 65 @IBAction func toAddViewController() { 66 performSegue(withIdentifier: "Add", sender: me) 67 } 68 69 70 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 71 return postArray.count 72 } 73 74 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 75 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! 76 cell.textLabel?.text = postArray[indexPath.row].content 77 78 print(postArray) 79 database.collection("users").document(postArray[indexPath.row].senderID).getDocument { (snapshot, error) in 80 if error == nil, let snapshot = snapshot, let data = snapshot.data() { 81 let appUser = AppUser(data: data) 82 cell.detailTextLabel?.text = appUser.userName 83 } 84 } 85 return cell 86 } 87 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 88 postArray.remove(at: indexPath.row) 89 Firestore.firestore().collection("posts").document(postArray[indexPath.row].postID).delete() 90 tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic) 91 print(postArray) 92 } 93}

Swift.AddViewController

1import UIKit 2import Firebase 3 4class AddViewController: UIViewController { 5 6 @IBOutlet var contentTextView: UITextView! 7 8 var me: AppUser! 9 var database: Firestore! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 setupTextView() 14 database = Firestore.firestore() 15 } 16 17 func setupTextView() { 18 let toolBar = UIToolbar() 19 let flexibleSpaceBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 20 let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissKeyboard)) 21 toolBar.items = [flexibleSpaceBarButton, doneButton] 22 toolBar.sizeToFit() 23 contentTextView.inputAccessoryView = toolBar 24 } 25 26 @objc func dismissKeyboard() { 27 contentTextView.resignFirstResponder() 28 } 29 30 @IBAction func postContent() { 31 let content = contentTextView.text! 32 let saveDocument = database.collection("posts").document() 33 saveDocument.setData([ 34 "content": content, 35 "postID": saveDocument.documentID, 36 "senderID": me.userID, 37 "createdAt": FieldValue.serverTimestamp(), 38 "updatedAt": FieldValue.serverTimestamp() 39 ]) { error in 40 if error == nil { 41 self.dismiss(animated: true, completion: nil) 42 } 43 } 44 } 45 46 @IBAction func back() { 47 dismiss(animated: true, completion: nil) 48 } 49}

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaboy

2022/03/01 19:07

自分の知識不足でした。 情報を教えて頂き、ありがとうございました。
guest

回答1

0

自己解決

override func viewWillApearメソッド内を

swift.TimelineViewController

1 database.collection("posts").order(by: "createdAt",descending: true).getDocuments { (snapshots, error) in

に書き換える。

投稿2022/03/01 20:46

masaboy

総合スコア61

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問