2017-02-17 10 views
2

私はこの問題を3日間以上にわたって抱えていましたが、私は研究していて、私の問題に関連する他の同様の質問に出くわしましたが、この質問。Firebase迅速なクエリとクライアント側のファンアウト

私は、firebaseにusers、posts、users-postsというノードがあります。私は、2人のユーザーが友人である場合、互いの投稿を見ることができるようにノード上でクエリを実行したい。彼らは友人でない場合でも、彼らはこれが現在、私のクエリでお互いのポスト

Users 
123840ajldkjfas0d9 
    username: Joe 
    friend 
    78983049802930laks: true 
    78983049802930laks: true 

4563049802930laks 
    username: Ken 
    friend 
    123840ajldkjfas0d9: true 

78983049802930laks 
    username: Pean 
    friend 
     123840ajldkjfas0d9: true 

posts 
876f92fh02hfj02930239 
    post: This is cool 
    whoposted: 123840ajldkjfas0d9 

39fh938hqw9320923308 
    post: I love pizza 
    whoposted: 78983049802930laks 

users-posts 
    123840ajldkjfas0d9 
    876f92fh02hfj02930239: true 

    78983049802930laks 
    39fh938hqw9320923308: true 

を見ることができない、彼らが友人であるかどうか、すべてのユーザーのすべてのポストを示しています。私はこれに助けが必要です。

DataService.ds.REF_USERS.observe(.value, with: { (userSnapshot) in 
    if let snapshot = userSnapshot.children.allObjects as? 
    [FIRDataSnapshot]{ 
      for userSnap in snapshot{ 
       print("snapshot.key: \(userSnap.key)") 
       let userKey = userSnap.key 
       if var userDict = userSnap.value as? Dictionary<String, 
    AnyObject>{ 

    let postUserPicUrl = userDict["profileImgUrl"] as? String 

    if let firstName = userDict["firstName"] as? String{ 
         ("firstName: \(firstName)") 

    DataService.ds.REF_POST.observeSingleEvent(of: .value, with: { 
    (postSnapshot) in 
    if let postSnapshot = postSnapshot.children.allObjects as? 
    [FIRDataSnapshot]{ 
    for postSnap in postSnapshot{ 
    if var postDict = postSnap.value as? Dictionary<String, AnyObject>{ 
    if let refPostUserKey = postDict["user"] as? String{ 
    if userKey == refPostUserKey{ 

    DataService.ds.REF_BLOCK_USER.observeSingleEvent(of: .value, with: { 
    (blockUserSnapshot) in 
    if let blockUserSnapshot = blockUserSnapshot.children.allObjects as? 
    [FIRDataSnapshot] { 
    for blockUserSnap in blockUserSnapshot{ 
    if var blockUserDict = blockUserSnap.value as? Dictionary<String, 
    AnyObject> { 
    if let  user = blockUserDict["user"] as? String{       
    if firstName != user {                                        
    postDict["postUserPicUrl"] = postUserPicUrl as AnyObject?;              
     let postKey = postSnap.key 
     let post = Post(postKey: postKey, postData: postDict) 

     self.posts.append(post) 

                    } 
                   } 
                  } 
                 } 
                } 
          self.tableView.reloadData() 
               }) 




              } 
             } 
            } 
           } 
          } 
          self.tableView.reloadData() 
         }) 
        } 
       } 
       } 
      } 
     self.tableView.reloadData() 
     }) 
    } 
+0

私は、すぐに私のプロジェクトの状況を正確に、この種に直面するだろううまくいけば、あなたは答えを得るだろうが、すぐに –

+0

あなたのコードは混乱であり、それは非常に読み困難だ - それは非常に困難を手助けすることができました。書式設定、特に入れ子関数の字下げを修正してください。 – Pierce

答えて

1

ノー無礼でこれを意味していますが、別の内にネストされたそれぞれと同様にこれらのクエリを使用していません。また、すべてのクエリを更新するようにしてください。投稿クエリは、ユーザーのクエリが最新である間に古い形式を使用します。

あなたは、各ノードのユーザー、投稿、ユーザー、投稿だけでなく、現在のユーザーの文字列とPOSTデータを格納するための辞書を保持するVARのためのデータを保持するために三つの辞書を作成する必要があります。

var users = [String:Any]() 
var posts = [String:Any]() 
var usersposts = [String:Any]() 
var currentUserKey:String! 
var visibleposts = [String:Any]() 

次に、データを取得するために3つの個別のクエリを持っています。

func getUserData(){ 
    DataService.ds.REF_USERS.observe(.childAdded, with: {snapshot in 
     let key = snapshot.key 
     let data = snapshot.value as? [String:Any] ?? [:] 
     self.users[key] = data 
    }) 
} 
func getPostsData(){ 
    DataService.ds.REF_POST.observe(.childAdded, with: {snapshot in 
     let key = snapshot.key 
     let data = snapshot.value as? [String:Any] ?? [:] 
     self.posts[key] = data 
     self.refreshPosts() 
    }) 
} 
func getUsersPostsData(){ 
    DataService.ds.REF_BLOCK_USERS.observe(.childAdded, with:{snapshot in // I am guessing you have the users posts here?? there doesn't seem to be sample data for blocked users in your OP 
     let key = snapshot.key 
     let data = snapshot.value as? [String:Any] ?? [:] 
     self.usersposts[key] = data 
     self.refreshPosts() 
    }) 
} 

今すぐビューでこれらのクエリをオフに発射する前に、現在のユーザーを取得し、負荷を行なったし、その後、各クエリを呼び出す:現在、あなたがそう、私は同じことをするでしょう任意の特定のユーザーのために照会されていることを表示されません。

override func viewDidLoad(){ 
    self.currentUserKey = (FIRAuth.auth()?.currentUser?.uid)! 
    /* you may want to do some error handling here to ensure the user 
    is actually signed in, for now this will get the key if 
    they are signed in */ 
    self.getUserData() 
    self.getPostsData() 
    self.getUsersPostsData() 

    // data will be refreshed anytime a child is added 
} 
func refreshPosts(){ 
    self.validposts = [:] 
    let validUsers = [String]() // this will hold the valid keys to get posts 
    validUsers.append(self.currentUserKey) 
    let currentUserData = users[self.currentUserKey] // filter the current user data to get the friends 
    // get friends keys 
    let friendsData = currentUserData["friends"] as? [String:Any] ?? [:] 
    for key in friendsData.keys { 
     // add friends posts to the validposts data 
     validUsers.append(key) 
    } 
    // get current users posts: 
    for (key,value) in self.posts { 
     let postData = value as? [String:Any] ?? [:] 
     let whoposted = postData["whoposted"] as? String ?? "" 
     if validUsers.contains(whoposted){ 
      self.validposts[key] = postData 
     } 
    } 
    // access the self.validposts data in your UI however you have it setup 

    // The child added queries above will continue to fire off and refresh 
    // your data when new posts are added. 

    // I am still not clear what the usersposts data is for so it is omitted here. 
} 
+0

@mathewあなたのフィードバックのために多くの感謝。私は準備が進んでいるようだ。現在私が抱えている問題は、印刷されると空であるということです。あなたがアドバイスしていただけますか? –

+0

データの印刷に使用しているコードは何ですか?また、スナップショットを印刷してデータがあるかどうかを確認してください。 – matthew

+0

@mathewそれは印刷されていて、私は私のUIを設定することができます。しかし、データは重複しています。当初、私はそれがテーブルビューセルの問題だと思っていました。しかし、私はuserspostsとユーザーがそれの中のデータが重複している印刷するときに私は再びエイリアスを確認しています。重複したデータを取り除く方法をアドバイスしてください。 –