こんにちは。いつもお世話になっております。
現在タイムライン機能のある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に表示するために、最善の方法とは一体どのようなものなのでしょうか?
わかりづらく長ったらしい質問で申し訳ないのですが、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/01 06:10
2017/12/01 06:23