Firebase ChildAdded 每次在我的 iOS 应用程序中触发

Posted

技术标签:

【中文标题】Firebase ChildAdded 每次在我的 iOS 应用程序中触发【英文标题】:Firebase ChildAdded firing every time in my iOS App 【发布时间】: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 个联系人。 【参考方案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 ...

这将获取一次数据..

【讨论】:

以上是关于Firebase ChildAdded 每次在我的 iOS 应用程序中触发的主要内容,如果未能解决你的问题,请参考以下文章

Firebase + Android - 通知 ChildAdded - 如何只获得新的孩子?

当从 Firebase 管理员(nodejs)推送孩子时,Firebase childAdded 观察者不会被触发

Swift Firebase:带有 .childAdded 的 UIRefreshControl

如何检测firebase观察childAdded在达到queryLimit时停止调用?

Firebase .childAdded 和活动指示器

Swift -Firebase 如何知道 .childAdded 是不是为空?