Firebase加载快照问题
问题描述:
我使用Firebase作为消息传递目的的数据库。Firebase加载快照问题
- 我的第一个问题在
observeEventType:
-block。它被频繁地调用多次,我不知道何时停止活动指标。 - 另一个问题是
scrollToRowAtIndexPath
挂我的视图,直到所有的Firebase快照不加载。目的是向下滚动到表格视图的最后一行。请帮忙。
Firebase数据库查询中是否有任何内容可以知道Firebase数据库上有多少计数?
firRef = [[[FIRDatabase database] reference] child:childLocation];
[firRef keepSynced:YES];
fireDBHandler = [firRef observeEventType:FIRDataEventTypeChildAdded
withBlock:^(FIRDataSnapshot *snapshot) {
NSMutableDictionary<NSString *, NSString *> *messageDic = snapshot.value;
[self.clientTable scrollToRowAtIndexPath:[NSIndexPath
indexPathForRow:[messages count]-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}];
答
我建议您阅读working with lists of data,因为它解释了事件是如何工作的。
挖掘到您的代码在这里稍微有一些意见:
您使用的是ChildAdded事件和文档状态
此事件为每个现有的孩子每次触发一次,然后再次 一个新的孩子被添加到指定的路径。
所以,如果你有10个子节点,那么这个块将在连续被调用10次,每个子对象被调用一次。根据你的代码,它将试图为每个不必要的孩子滚动。
有几个解决方案。
如果您正在加载一系列用户,则可以使用Value的单个事件。这将读取所有节点,然后您可以遍历节点,填充数据源(通常是数组),然后直接滚动到最后一个索引。
[ref observeSingleEventOfType:FIRDataEventTypeValue withBlock:
^(FIRDataSnapshot * _Nonnull snapshot) {
//it is here we iterate over each node in the snapshot
//and add the data to an array dataSource.
} withCancelBlock:^(NSError * _Nonnull error) {
NSLog(@"%@", error.localizedDescription);
}];
另一个选择是利用事件在ChildAdded事件后被调用的事实。
从概念上讲,您将一个childAdded观察者连同一个Value观察者一起附加到同一节点。子添加的事件将首先触发,并将遍历每个孩子,以便您可以将其添加到数组数据源,然后当完成值事件将触发,您可以重新加载tableView或滚动到最后一个索引,因为所有孩子都已经加载。
有关编码示例,请参阅我对Loading Records的回答。
是的,observeSingleEventOfType保存我的时间。它在一个节点返回计数,并且我动画直到所有快照都等于计数。谢谢!! – Ketan