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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

Q&A

解決済

1回答

524閲覧

iOSアプリでSNSのタイムライン機能を実装したい!〜Firestoreを使って

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

0グッド

3クリップ

投稿2017/12/01 03:24

編集2017/12/01 04:13

こんにちは。いつもお世話になっております。

現在タイムライン機能のあるiOSアプリケーションの開発をしています、駆け出しのエンジニアです。

###前提・実現したいこと

タイムラインの実装にあたって、困っていることがあります。

Firestoreのほうは

| |-users-(uid)-|-username | |-userImageUrl | |-userId | |-uid | | |-posts-(postID)- |-postImageUrl | |-text | |-postID | |-uid | |-date | |-follows-(uid)- |-followingPosts -|-(postID)-|-postImageUrl | |-text | |-postID | |-uid | |-date |

という風になっており、タイムラインに流れてくる投稿は全てfollowsコレクションの自分のドキュメントの中のfollowingPostsに入っています。

なので、タイムラインはfollowingPostsの中を新しいものから順番に取り出すだけでいいのですが、ユーザー情報を同時に取り出すのに苦労しています。

###最初に試したこと
最初に試したことは、followingPostsの中にある投稿には投稿主のuidが入っているので、それを使ってcellForRowAt内で、毎回Firestoreからusersコレクションの中の該当ユーザーの情報を引っ張ってきていました。

しかしこのやりかただと、毎回データを取りに行って更新するので、スクロールしたときにタイムラインの投稿と一緒に表示するユーザー画像やユーザー名が切り替わり、点滅して気持ち悪かったのでやめました。
###次に試したこと(現状)
次に試したのは、最初にfollowingPostsからデータを取ってくる際に、for文を回して用意しておいたpostArrayとは別のuserArrayという配列にappendしてみました。

該当のコードはこちらです。

Swift

1 // データの取得 2 func loadAllData(num: Int) { 3 4 userArray = [User]() 5 postArray = [Post]() 6 7 let myUid = Auth.auth().currentUser?.uid 8 9 Firestore.firestore().collection("follows").document(myUid!).collection("followingPosts").order(by: "date", descending: true).limit(to: num).getDocuments() { ( 10 querySnapshot, error) in 11 if let error = error { 12 print("Error getting documents: (error.localizedDescription)") 13 self.indicator.hidesWhenStopped = true 14 self.viewForIndicator.isHidden = false 15 self.indicator.stopAnimating() 16 }else { 17 self.postArray = querySnapshot!.documents.flatMap({Post(dictionary: $0.data())}) 18 19 if self.postArray.count > 0 { 20 for user in self.postArray { 21 let uid = user.userID 22 let ref = Firestore.firestore().collection("users").document(uid) 23 24 ref.getDocument { (document, error) in 25 if let user = document.flatMap({ User(dictionary: $0.data()) }) { 26 self.userArray.append(user) 27 if self.postArray.count == self.userArray.count { 28 DispatchQueue.main.async { 29 self.tableView.reloadData() 30 } 31 self.viewForIndicator.isHidden = true 32 } 33 } else { 34 print("Document does not exist") 35 } 36 } 37 } 38 } else { 39 40 self.noPostLabel.isHidden = false 41 42 } 43 44 45 if self.postArray.count == self.userArray.count { 46 DispatchQueue.main.async { 47 self.tableView.reloadData() 48 } 49 self.viewForIndicator.isHidden = true 50 } 51 52 53 self.indicator.hidesWhenStopped = true 54 self.viewForIndicator.isHidden = true 55 self.indicator.stopAnimating() 56 57 } 58 } 59 }

しかし、これだと現状、for文が回り切らなかったりするのかユーザー情報と投稿が違うものにずれて表示されたりと、不安定な状況です。

###考えたこと

user情報も全てpostドキュメントの中に入れてしまう方法もあるのかとは思いますが、ユーザー情報に更新があった際、すべての投稿のデータを書き換えるのはしんどいと思い断念いたしました。

2つのデータベーステーブルからデータを取ってきてtableViewに表示するために、最善の方法とは一体どのようなものなのでしょうか?

わかりづらく長ったらしい質問で申し訳ないのですが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

本来のFirebaseらしいやり方としては,「考えたこと」がそれにあたります.
この場合ユーザ情報の更新へは対応しないべきでしょう(その当時の実際のユーザ情報ではあったわけですから,意図的に変更しないとしてもこれはこれで正しいとも思います).

変更に対応したい必要性が高い場合は,「最初に試したこと」を起点に工夫すべきかと思います.
見た目を工夫すれば済む話かと思いますので(例えばスクロールされる前の画面外の部分で先に読み込んでしまうなど).

投稿2017/12/01 06:06

Yatima

総合スコア1159

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

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

退会済みユーザー

退会済みユーザー

2017/12/01 06:10

いつもありがとうございます。なるほど、少しずつFirebaseたるものがわかってきた気がします。「考えたこと」で実装しようと思います。
Yatima

2017/12/01 06:23

いえいえ.いいですね!応援しています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問