多次加载同一屏幕时,firebase快照会更改

时间:2019-01-22 15:39:15

标签: ios swift firebase firebase-realtime-database

在我的项目中,我可以单击其他用户的个人资料。打开个人资料后,我检查用户是否公开以及他们是否是朋友。这是通过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"

和用户2:

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朋友,尽管我从未这样称呼过。显然,它认为我们不欢迎朋友,因为快照没有{2用户hasChild,因此profileIsPrivateAndNotFriends()方法被调用。

有人知道出了什么问题吗,为什么快照显示更改一次以上而无法显示配置文件页面?在此期间,数据库永远不会更改。谢谢

1 个答案:

答案 0 :(得分:1)

在视图之间进行筛选时,如何设置areTheFriends()的“用户”变量?可能是第二次未设置,因此areTheFriends的布尔闭包将始终返回false。