Firebase加载快照问题

问题描述:

我使用Firebase作为消息传递目的的数据库。Firebase加载快照问题

  1. 我的第一个问题在observeEventType: -block。它被频繁地调用多次,我不知道何时停止活动指标。
  2. 另一个问题是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的回答。

+0

是的,observeSingleEventOfType保存我的时间。它在一个节点返回计数,并且我动画直到所有快照都等于计数。谢谢!! – Ketan