Firebase加载快照问题

时间:2016-12-27 10:06:04

标签: ios objective-c firebase firebase-realtime-database

我使用Firebase作为数据库用于消息传递。

  1. 我在observeEventType:中的第一个问题 - 阻止。它被多次调用,我不知道何时停止活动指示。
  2. 另一个问题是scrollToRowAtIndexPath挂起我的视图,直到所有Firebase快照都未加载。目的是向下滚动到表格视图的最后一行。请帮忙。
  3. 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];
    
        }];
    

1 个答案:

答案 0 :(得分:2)

我建议阅读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事件之后调用Value事件的事实。

从概念上讲,您将一个childAdded观察者与一个Value观察者连接到该节点。子级添加事件将首先触发并将遍历每个子级,因此您可以将其添加到数组数据源,然后在完成时将激活值事件,您可以重新加载tableView或滚动到最后一个索引,因为所有子级都已加载。

有关编码示例,请参阅我对Loading Records的回答。