2016-11-22 2 views
0

私は次のシステムを作っています。ユーザーはお互いにフォローできますが、あまり役に立ちません。あなたがフォローしているユーザーの投稿だけを表示する方法について頭を悩ますようには思えません。だから私はここであなたがそれをやる方法を尋ねます。あなたがフォローしているユーザーからの投稿を表示します - 迅速かつファイアベース

データベースの設定方法私はあなたをお見せしましょう:あなたは、私がUsersと呼ばれるタップを持って見ることができるように

enter image description here

- そこにすべてのユーザーのIDが格納されています。ユーザーが別のユーザーに従うことを望むときはいつでも、タップFollowingが作成され、その下に現在のユーザーが押されたユーザーが従います。そのIDはFollowingの下に格納されます。そして、現在のユーザーIDは、Followersの下に従うユーザーに追加されます。説明するのはとてもシンプルですが複雑です:D私はあなたがどこに行くのか願っています。

だから、今私が従うユーザーの投稿を表示したいだけです。あなたはどうしますか?ユーザーが投稿をしているときは、Postsという名前のタップの下で自分の名前に追加され、PostsToFollowの下のすべてのユーザー名に追加されますか?私はそれがデータベースの多くのスペースを占めると思いますか?これを行う良い方法はありませんか?

ここに私のコードの一部があり、私のすべての現在のユーザーフォロワーを取得しています。そのコードをどのように使って、新しい投稿を作成しているときにも、その投稿をpostsToFollowに追加できますか?私は私のユーザーに従っているすべてのユーザーに全体のポストを追加するためにこれを作った

:フランクへ

func startObersvingDB() { 
     FIRDatabase.database().reference().child("Users").child(IDgotten).child("Followers").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
      var newUpdates = [FollowersStruct]() 



      for update in snapshot.children { 
       print(update) 
       let updateObject = FollowersStruct(snapshot: update as! FIRDataSnapshot) 
       newUpdates.append(updateObject) 

      } 

      self.updates = newUpdates.reverse() 
      self.tableView.reloadData() 


     }) { (error: NSError) in 
      print(error.description) 
     } 
    } 

。投稿に好きなコメントボタンがあり、あるユーザの投稿の好きさが他のユーザの投稿と同じにならないので、私はそれを行うことができません。そのため、フォロワーの壁のポストにキーを追加するという考え素晴らしいです。しかし、どうすればいいのですか?ユーザー自身の名前すべての彼のフォロワーの名前で記事を書く

let feed = Sweet(content: update, addedByUser: name!, profilePhoto: uid, likesForPost: ["user id": false], date: timePosted, category: 1, workoutComment: "", workoutTime: "") 
    let feedRef = FIRDatabase.database().reference().child("feed-items").childByAutoId() 


    feedRef.setValue(feed.toAnyObject()) 

    FIRDatabase.database().reference().child("Users").child(uid).child("Followers").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
     var newFollowers = [FollowersStruct]() 



     for updateFollowers in snapshot.children { 
      let updateObjectFollowers = FollowersStruct(snapshot: updateFollowers as! FIRDataSnapshot) 
      newFollowers.append(updateObjectFollowers) 

     } 

     self.followings = newFollowers 


     print(self.followings.count) 




     for i in 0..<self.followings.count { 
      let followers = self.followings[i] 

      let feedRefFollowers = FIRDatabase.database().reference().child("Users").child(followers.Id).child("Wall").childByAutoId() 
      feedRefFollowers.setValue(feed.toAnyObject()) 
     } 


    }) { (error: NSError) in 
     print(error.description) 
    } 

答えて

0

は、ファンアウトの典型的な例である:私はあなたが:-)言っ達成しようとし、これまでしてきた

データ。これは実際にデータを複製しますが、読取り操作がはるかに高速でコードが大幅に単純になるという利点があります。

投稿全体を複製したくない場合は、各投稿者の「壁」の下に新しい投稿のキーを書くこともできます。次に、ユーザーの投稿のリストを表示する必要がある場合は、それぞれの投稿に「壁」とクライアントサイドを読み込みます。これは我々のclassic Firefeed example appで取られたアプローチです。

いずれの方法も非正規化の一種です。データの一部を複製してより良い読み取りパフォーマンスを得る方法です。

NoSQL data modelingでこの記事を読んで、ビデオシリーズをFirebase for SQL developersでチェックすることを強くおすすめします。ああ...そしてこのblog post on client-side fan-outも怪我をしません。

+0

私はユーザの "壁"に投稿キーを追加するといっているようです。しかし、どのようにそれらのすべてのキーを読んで、それから投稿を取得するのですか? –

+0

そして、新しく追加された投稿のキーはどうやって入手できますか? –

+0

私は何をしようとしているのかを知ることができるメッセージを使ってこの投稿を編集しました:D –

関連する問題