我使用Firebase作为数据库用于消息传递。
observeEventType:
中的第一个问题 - 阻止。它被多次调用,我不知道何时停止活动指示。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];
}];
答案 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的回答。