【问题标题】:Firebase ChildAdded Observer is Retrieving Data That Doesn't ExistFirebase ChildAdded 观察者正在检索不存在的数据
【发布时间】:2018-10-11 02:14:32
【问题描述】:

我正在使用添加的子观察者来检查用户在使用我的应用程序时是否收到新通知...

 func newLikeNotificationObserver() {
    notifHandle = Database.database().reference().child("notifications").child(FirebaseDatabase.system.CURRENT_USER_ID).observe(DataEventType.childAdded, with: { (snapshot) in
        if !snapshot.exists() {
            print("ERROR")
            return
        }
        let id = snapshot.key
        print(id)
        if let dict = snapshot.value as? Dictionary<String, Any>  {
            print("ADDED TO LIST")
            let notif = Notifications(notifID: id, data: dict)
            self.notifications.insert(notif, at: 0)
            self.collectionView.reloadData()
        }
    })
}

我遇到的奇怪问题是,尽管当用户喜欢他/她自己的帖子时没有将数据写入我的数据库,但观察者被触发并且通知被插入到包含实际用户通知的数组中。当我打印出通知 ID 以查看是否可以在我的数据库中找到它时,找不到它。任何人都可以看到我可能出错了吗?

另外,我正在删除 deinit 方法中的观察者并将其添加到 viewdidload() 中。提前致谢

【问题讨论】:

  • 确实没有足够的信息来回答这个问题;您声明代码在 viewDidLoad 中调用 - 哪个视图?它是一个多次使用的视图吗?您在应用程序的其他任何地方是否有观察者或 Firebase 相关代码? notifHandle 是类变量还是可能包含在其他地方的单例中?视图是否真的在某个时候被忽略了?

标签: swift firebase firebase-realtime-database observers


【解决方案1】:

放置事件观察者的正确位置是在 viewDidAppear 中,并在 viewWillDisappear 中移除它们。

我认为以前的观察者很可能没有被删除并且返回了错误的数据。重新启动计算机并查看它是在应用程序的初始运行时发生,还是仅在后续启动时发生

【讨论】:

  • 根据这篇文章:firebase.googleblog.com/2015/10/…。 View 将出现是控制器生命周期中添加观察者的地方
  • 我认为重点是在 ViewDidLoad 中执行一次并不是执行此操作的理想位置。考虑到调用的异步性质,我认为无论是在 viewWillAppear 还是 viewDidAppear 中完成都无关紧要。
  • 我明白,但是,我什至无法追溯到可以创建数据源的位置。为了让单元格填充我的通知集合视图,需要在其数据源中附加一些内容,但事实并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2017-07-05
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多