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

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

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

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

解決済

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

masaboy
masaboy

総合スコア55

Swift

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

1回答

0評価

0クリップ

289閲覧

投稿2022/02/28 19:49

編集2022/03/02 05:46

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

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

発生している問題

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

自分がやったこと

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

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

Swift

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

を入力するとエラー

Swift

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

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

該当のソースコード

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

Swift.Post

import Foundation import Firebase struct Post { let content: String let postID: String let senderID: String let createdAt: Timestamp let updatedAt: Timestamp init(data: [String: Any]) { content = data["content"] as! String postID = data["postID"] as! String senderID = data["senderID"] as! String createdAt = data["createdAt"] as! Timestamp updatedAt = data["updatedAt"] as! Timestamp } }

Swift.AppUser

import Foundation import Firebase struct AppUser { let userID: String let userName: String init(data: [String: Any]) { userID = data["userID"] as! String userName = data["userName"] as? String ?? "匿名" } }

Swift.TimelineViewController

import UIKit import Firebase class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableView: UITableView! var me: AppUser! var database: Firestore! var postArray: [Post] = [] override func viewDidLoad() { super.viewDidLoad() database = Firestore.firestore() tableView.delegate = self tableView.dataSource = self let press = UILongPressGestureRecognizer(target: self, action: #selector(pressScreen)) press.minimumPressDuration = 1.5 view.isUserInteractionEnabled = true view.addGestureRecognizer(press) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) database.collection("posts").getDocuments { (snapshots, error) in if error == nil, let snapshots = snapshots { self.postArray = [] for document in snapshots.documents { let data = document.data() let post = Post(data: data) self.postArray.append(post) } self.tableView.reloadData() } } database.collection("users").document(me.userID).setData([ "userID": me.userID ], merge: true) database.collection("users").document(me.userID).getDocument { (snapshot, error) in if error == nil, let snapshot = snapshot, let data = snapshot.data() { self.me = AppUser(data: data) } } } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "Add" { let destination = segue.destination as! AddViewController destination.me = sender as! AppUser } else if segue.identifier == "Settings" { let destination = segue.destination as! SettingsViewController destination.me = me } } @objc func pressScreen() { performSegue(withIdentifier: "Settings", sender: me) } @IBAction func toAddViewController() { performSegue(withIdentifier: "Add", sender: me) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = postArray[indexPath.row].content print(postArray) database.collection("users").document(postArray[indexPath.row].senderID).getDocument { (snapshot, error) in if error == nil, let snapshot = snapshot, let data = snapshot.data() { let appUser = AppUser(data: data) cell.detailTextLabel?.text = appUser.userName } } return cell } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { postArray.remove(at: indexPath.row) Firestore.firestore().collection("posts").document(postArray[indexPath.row].postID).delete() tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic) print(postArray) } }

Swift.AddViewController

import UIKit import Firebase class AddViewController: UIViewController { @IBOutlet var contentTextView: UITextView! var me: AppUser! var database: Firestore! override func viewDidLoad() { super.viewDidLoad() setupTextView() database = Firestore.firestore() } func setupTextView() { let toolBar = UIToolbar() let flexibleSpaceBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissKeyboard)) toolBar.items = [flexibleSpaceBarButton, doneButton] toolBar.sizeToFit() contentTextView.inputAccessoryView = toolBar } @objc func dismissKeyboard() { contentTextView.resignFirstResponder() } @IBAction func postContent() { let content = contentTextView.text! let saveDocument = database.collection("posts").document() saveDocument.setData([ "content": content, "postID": saveDocument.documentID, "senderID": me.userID, "createdAt": FieldValue.serverTimestamp(), "updatedAt": FieldValue.serverTimestamp() ]) { error in if error == nil { self.dismiss(animated: true, completion: nil) } } } @IBAction func back() { dismiss(animated: true, completion: nil) } }

イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

masaboy

2022/03/01 19:07

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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