如何根据追随者/追随者,Swift Firebase结交朋友

时间:2017-03-10 12:11:52

标签: firebase swift3

目前,我的Firebase数据库如下所示。我有三个用户:users我想制作这样的功能,当一个用户跟随另一个用户并且用户关注他时,他们将成为朋友。他们不会是朋友,直到他们都是彼此的追随者。到目前为止,我设法让关注者/关注者如下:user1 enter image description here enter image description here现在我不知道下一步该做什么。

1 个答案:

答案 0 :(得分:3)

小免责声明:我没有机会对此进行测试,请告诉我它是否符合您的要求。

在关注者之后,您似乎正在使用推送键添加正在关注或正在关注的人的用户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
      }
    }
  }
}

我认为使用数据库规则是最简单的方法。 使用这些规则,如果相关的两个用户彼此跟随,则用户将只能写入朋友/ $ friend。

{
  "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)执行相同操作。