Снимок Firebase изменяется при загрузке одного и того же экрана несколько раз - PullRequest
0 голосов
/ 22 января 2019

В моем проекте я могу нажимать на профили других пользователей. Когда открывается профиль, я проверяю, является ли пользователь общедоступным и являются ли они друзьями. Это делается с помощью этих методов, которые находятся внутри 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

на этот раз снимок выглядит немного иначе:

the friends snapshot = Snap (friends) {
vreBtOydi2e2DbPxQBdKBhoN1c82 = 1;
}

снимок показывает друзей пользователя user2, хотя я никогда этого не называл. И, очевидно, он думает, что мы не друзья, потому что снимок не hasChild из user2 uid и поэтому вызывается метод profileIsPrivateAndNotFriends().

Кто-нибудь знает, что происходит и почему, когда на странице профиля несколько раз отображается изменение снимка? База данных никогда не меняется в течение этого времени. Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Как настраивается переменная user в areTheyFriends () при переходе между представлениями?Возможно, это происходит не во второй раз, поэтому логическое закрытие для areTheyFriends всегда будет возвращать значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...