检查firebase持久数据

时间:2017-09-28 17:03:17

标签: ios swift firebase-realtime-database

我有一个处理友情请求的视图控制器,我启用了firebase持久性并且它完美地存储了每个请求,因此即使没有互联网我也可以访问我的数据。我已经实现了一个横幅,每当用户收到一个新的友谊请求(添加了一个新的子节点)时就应该出现这个横幅,但每次加载视图时都会出现横幅,不仅在添加新的子节点时,而且每当我调用我的观察者功能。那么有没有办法检查特定节点是否已经被firebase持久性缓存,然后才决定是否显示横幅? 我想到了核心数据(或其他任何东西) - 在本地保存来自firebase的数据,然后检查用户是否已收到请求,但我想知道可能有更简单的方法来实现这个

var names: [Name] = []

func fetchMyReqFriends() {
    let userID = Auth.auth().currentUser?.uid
    let ref = Database.database().reference()
    let reqFriendsRef = ref.child("users").child(userID!).child("reqFriends")
    reqFriendsRef.observe( .childAdded, with: { (snapshot) in
        let snapValue = snapshot.value as? NSDictionary
        let friends = snapValue?.allKeys as! [String]
        for each in friends {
            ref.child("users").child(each).child("profile").observeSingleEvent(of: .value, with: { (snapshot) in
                let friendPage = snapshot.value as? NSDictionary
                let snapUsername = friendPage?["username"] as? String ?? ""
                let snapFullname = friendPage?["fullname"] as? String ?? ""
                let userKey = each
                self.names.append(Name(nameTitle: snapFullname, nameDetail: snapUsername, userKey: userKey))
                self.tableView.reloadData()

                let avatarsRef = self.storageRef.child("avatars")
                let avatarRefByID = avatarsRef.child(each)
                avatarRefByID.getData(maxSize: 10*1024*1024) { (data, error) in
                    if data != nil {
                        let imageView = UIImageView(image: UIImage(data: data!))
                        imageView.layer.cornerRadius = 22
                        imageView.clipsToBounds = true
                        self.banner = NotificationBanner(title: snapUsername,
                                                        subtitle: "Offers a friendship",
                                                        leftView: imageView,
                                                        rightView: nil,
                                                        style: .info,
                                                        colors: nil)
                        self.banner.show()
                    }
                }
            })
        }
    })
    reqFriendsRef.observe( .childRemoved, with: { (snapshot) in
        if let index = self.names.index(where: { $0.userKey == snapshot.key }) {
            self.names.remove(at: index)
            let indexPath = IndexPath(row: index, section: 0)
            self.tableView.deleteRows(at: [indexPath], with: .fade)
            self.tableView.reloadData()
            SVProgressHUD.dismiss(withDelay: 0.25) {
                self.view.isUserInteractionEnabled = true
            }
        }
    })
    self.tableView.reloadData()
}

我只需要在添加新的子节点时显示横幅,而不是每次调用我的观察者时都显示

2 个答案:

答案 0 :(得分:0)

如果没有看到您的代码进行更全面的评估,那么,如果数据需要无限期地持续存在,那么首先要考虑缓存节点的问题是UserDefaults,如果数据需要保持不变,则NSCache某些情况下的数据。

答案 1 :(得分:0)

好的,我解决了。现在,当我展示横幅时,我发布了一个新值,如["已通知" :" true"]到一个请求,在显示横幅之前我会检查它是否真的"或" false"