В моем проекте я могу нажимать на профили других пользователей. Когда открывается профиль, я проверяю, является ли пользователь общедоступным и являются ли они друзьями. Это делается с помощью этих методов, которые находятся внутри User
класса
func areTheyFriends(user: User, _ completion: @escaping (Bool) -> Void){
Database.database().reference().child("users").child(uid).child("friends").observe(.value) { (snapshot) in
print("the friends snapshot = \(snapshot)")
if snapshot.hasChild(user.uid) {
completion(true)
}
else{
completion(false)
}
}
}
func checkIfPublic(_ completion: @escaping (Bool) -> Void){
Database.database().reference().child("users").child(uid).child("publicProfile").observe(.value) { (snapshot) in
let profile = snapshot.value as? Bool
completion(profile!)
}
}
первый метод будет наблюдать за друзьями currentUsers и видеть, находится ли пользователь в этом снимке. Второй метод проверяет, является ли пользователь публичным или нет.
Эти методы вызываются в классе с именем FriendsProfileTableViewController
следующим образом:
func checkIfPublic(_ completion: @escaping (Bool) -> Void) {
self.user.checkIfPublic { (isPublic) in
if isPublic == true {
print("the user is public")
completion(isPublic)
}else if isPublic == false{
print("the user is private")
completion(isPublic)
}
}
}
func checkIfFriends(_ completion: @escaping (Bool) -> Void) {
currentUser.areTheyFriends(user: user) { (areFriends) in
if areFriends == false {
print("users are not friends")
completion(areFriends)
}else if areFriends == true{
print("the users are friends")
completion(areFriends)
}
}
}
Я звоню им в viewWillAppear
checkIfPublic { (isPublic) in
self.checkIfFriends { (areFriends) in
if (isPublic == true) && (areFriends == false) {
//is the user is public but are not friends
self.setPageIfNotFriends()
}
if (isPublic == false) && (areFriends == false) {
//if the user is private and they are not friends
self.profileIsPrivateAndNotFriends()
}
if (areFriends == true) {
self.setPageIfFriends()
}
}
}
Если пользователь общедоступный и два пользователя не являются друзьями , тогда я настраиваю страницу так же, используя кнопку добавления друга. Однако, если пользователь частный и два пользователя не являются друзьями , тогда я отклоняю страницу следующим способом:
func profileIsPrivateAndNotFriends(){
self.popup.showUnsuccessfullAlert(message: "You cannot view this profile. You and \(self.user.firstName) are not friends")
self.navigationController?.popViewController(animated: true)
}
У меня проблема, например, с текущим пользователем
users --
vreBtOydi2e2DbPxQBdKBhoN1c82 --
birthday: "09/06/1996"
firstName: "Beth"
friends --
BgwmyThLOuhmzwsaCvM0Z6ILDNn1: true
lastName: "jones"
publicProfile: true
uid: "vreBtOydi2e2DbPxQBdKBhoN1c82"
и user2:
users --
BgwmyThLOuhmzwsaCvM0Z6ILDNn1 --
birthday: "14/03/1995"
firstName: "Andrew"
friends --
vreBtOydi2e2DbPxQBdKBhoN1c82: true
lastName: "Harris"
publicProfile: false
uid: "BgwmyThLOuhmzwsaCvM0Z6ILDNn1"
Оба пользователя являются друзьями, поэтому, когда я нажимаю на профиль user2, я вижу профиль, и все нормально, в консоли, когда запускается areTheyFriends
, это показывает:
the friends snapshot = Snap (friends) {
BgwmyThLOuhmzwsaCvM0Z6ILDNn1 = 1;
}
, который является снимком для друзей текущего пользователя. Однако, когда я перемещаюсь по профилю user2, я могу нажать на один из их списков, который открывает новую страницу их списков. Отсюда я могу нажать на имя пользователя user2, которое снова приводит меня к их профилю. Вот так:
![enter image description here](https://i.stack.imgur.com/dr1Xn.png)
на этот раз снимок выглядит немного иначе:
the friends snapshot = Snap (friends) {
vreBtOydi2e2DbPxQBdKBhoN1c82 = 1;
}
снимок показывает друзей пользователя user2, хотя я никогда этого не называл. И, очевидно, он думает, что мы не друзья, потому что снимок не hasChild
из user2 uid и поэтому вызывается метод profileIsPrivateAndNotFriends()
.
Кто-нибудь знает, что происходит и почему, когда на странице профиля несколько раз отображается изменение снимка? База данных никогда не меняется в течение этого времени. Спасибо