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