我有一个处理友情请求的视图控制器,我启用了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()
}
我只需要在添加新的子节点时显示横幅,而不是每次调用我的观察者时都显示
答案 0 :(得分:0)
如果没有看到您的代码进行更全面的评估,那么,如果数据需要无限期地持续存在,那么首先要考虑缓存节点的问题是UserDefaults,如果数据需要保持不变,则NSCache某些情况下的数据。
答案 1 :(得分:0)
好的,我解决了。现在,当我展示横幅时,我发布了一个新值,如["已通知" :" true"]到一个请求,在显示横幅之前我会检查它是否真的"或" false"