目前,我的Firebase数据库如下所示。我有三个用户:我想制作这样的功能,当一个用户跟随另一个用户并且用户关注他时,他们将成为朋友。他们不会是朋友,直到他们都是彼此的追随者。到目前为止,我设法让关注者/关注者如下: 现在我不知道下一步该做什么。
答案 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)
执行相同操作。