【问题标题】:Firebase ChildAdded firing every time in my iOS AppFirebase ChildAdded 每次在我的 iOS 应用程序中触发
【发布时间】:2016-08-02 08:55:13
【问题描述】:

我有一个简单的 iOS 应用,可以将 1000 个联系人与我的 Firebase 同步。 persistenceEnabled 在我的 AppDelegate 中设置为 true。

在我的 UITableViewController 中,我观察到 ChildAdded 事件,下载联系人,这工作正常。

问题是这样的 - 下次我打开应用程序时,导航回 UITableViewController,ChildAdded 事件再次触发并加载 1,000 个联系人。

我认为会发生的是,在后续启动时 ChildAdded 事件不会触发,因为 persistenceEnabled 为 true 并且没有添加新的 Children。

我是否误解了 Firebase 的工作原理?

ref.child("contacts").observeEventType(.ChildAdded, withBlock: { snapshot in

    if let json = snapshot.value as? NSDictionary {

        for key in json.keyEnumerator() {
            if let dict = json.valueForKey(key as! String) as? NSDictionary {
                let contact = Contact(data: dict)
                contacts.append(contact)
            }
        }
    }
})

【问题讨论】:

  • 检查此代码是从 viewWillAppear 还是从 viewDidAppear 调用的。如果是这样,那么每次您导航回此控制器时它都会进行观察。
  • 嗨,Deepak,它正在 viewWillAppear 中被调用,但这不是问题。我希望每次导航回控制器时它都能观察到,但我不希望它每次都返回 1,000 个联系人。我原以为它第一次只会返回 1,000 个联系人。

标签: ios firebase firebase-realtime-database


【解决方案1】:

来自Firebase documentation on .ChildAdded:

FIRDataEventTypeChildAdded 事件为每个现有的孩子触发一次,然后每次将新的孩子添加到指定的路径时再次触发。

使用持久性不会改变这种行为。它只是确保如果在您没有网络连接时启动应用程序,事件也将以这种方式工作。

【讨论】:

  • 谢谢弗兰克,我怀疑是这样的。这是将 1,000 个联系人加载到内存中吗?在我的场景中,我希望拥有我可以查询的本地联系人缓存,就像在典型的 CoreData 场景中一样,并且仅在后端添加新联系人时更新此缓存。使用 Firebase 时,我似乎总是从本地缓存(持久化)或通过网络加载这 1,000 个联系人。
  • Firebase API 是一个在线优先的 API,当您的应用在短到中等长度的时间内离线时,它会继续工作。要使数据保持最新,请参阅firebase.google.com/docs/database/ios/…
  • @FrankvanPuffelen 如何防止这种情况。就像我想在没有为现有节点添加新孩子时执行 .childadded 一样。
【解决方案2】:

由于您注册的是 observeEventType 而不是 observeSingleEventType。所以在 viewDidLoad 中只注册一次事件。您将第一次获得该节点中可用的所有数据。下次它只会给你添加的新孩子。如果您想每次都查询firebase,然后注册observeSingleEventType,但它会再次返回该节点中可用的所有数据,并删除observer,因为它是observeSingleEventType。

【讨论】:

    【解决方案3】:

    使用这个方法: Database.database().reference().child("anything").observeSingleEvent(of: .value, with: { snapshot in ...

    这将获取一次数据..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-29
      • 2019-04-17
      • 2020-12-29
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多