2017-03-10 102 views
0

目前我的Firebase數據庫如下所示。我有三個用戶:users我想要這樣做的功能,當一個用戶跟隨另一個用戶,用戶跟着他回來,他們將成爲朋友。他們不會是朋友,直到他們都是彼此的追隨者。到目前爲止,我已經設法讓追隨者/如下所示:user1enter image description hereenter image description here現在我不知道接下來要做什麼。如何根據關注/追隨者交友,Swift Firebase

回答

2

小聲明:我沒有機會測試這個,讓我知道如果它做到了你想要的。

在追隨者和下面你似乎正在使用按鍵來添加被跟蹤或正在關注的人的用戶ID。相反,我只需將uid添加爲子項,並將該節點的值設置爲隨機值。然後,當你想要一個用戶的追隨者,你會得到所有的密鑰,而不是所有的值。

數據庫結構:爲簡潔起見,我省略了任何不相關的內容。

root: { 
    user_profile: { 
    $user1: { 
     followers: { 
     $user2: true, 
     $user3: true 
     }, 
     following: { 
     $user2: true, 
     $user3: true 
     }, 
     friends: { 
     $user2: true, 
     $user3: true 
     } 
    }, 
    $user2: { 
     followers: { 
     $user3: true, 
     $user1: true 
     }, 
     following: { 
     $user3: true, 
     $user1: true 
     }, 
     friends: { 
     $user3: true, 
     $user1: true 
     } 
    }, 
    $user3: : { 
     followers: { 
     $user2: true, 
     $user1: true 
     }, 
     following: { 
     $user1: true, 
     $user2: true 
     }, 
     friends: { 
     $user1: true, 
     $user2: true 
     } 
    } 
    } 
} 

我認爲使用數據庫規則將是最簡單的方法來做到這一點。 使用這些規則,如果有問題的兩個用戶彼此關注,用戶將只能寫信給朋友/ $朋友。

{ 
    "rules": { 
    "user_profile": { 
     ".read": true, 
     "$user_profile": { 
     ".write": "$user_profile === auth.uid", 
     "friends": { 
      "$friend": { 
      ".write": "(data.parent().parent().child('followers/'+auth.uid).exists() && data.parent().parent().child('following/'+auth.uid).exists()) && $friend === auth.uid" 
      } 
     }, 
     "followers" : { 
      "$follower": { 
      ".write": "$follower === auth.uid" 
      } 
     } 
     } 
    } 
    } 
} 

關於如何關注某人的小例子。

func follow(uid: String) -> Void { 
    // Obv you'd want to do some extra checks here such as whether the user is logged in or not, but for the sake of brevity they're omitted. 
    let dbRef = FIRDatabase.database().reference().child("user_profile") 
    let userID = FIRAuth.auth()?.currentUser?.uid 
    dbRef.child("\(userID)/following/\(uid)").setValue(true); 
    dbRef.child("\(uid)/followers/\(userID)").setValue(true); 
    dbRef.child("\(userID)/friends/\(uid)").setValue(true); // These should fail if the users aren't following each other. 
    dbRef.child("\(uid)/friends/\(userID)").setValue(true); // These should fail if the users aren't following each other. 
} 

而對於取消關注你會做同樣的只有.remove()代替.setValue(true)的用戶。

+0

非常感謝@Pieter,明天我會測試它,讓你知道。謝謝你的解釋和時間伴侶。 –

+0

是的,你的想法正在爲我工​​作。那很棒。再次感謝你 :) –