タイムラインに投稿順に表示したい!!
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) } }
まだ回答がついていません
会員登録して回答してみよう