我创建了简单的UITableView,其中有几行是从Firebase加载的。 在viewWillAppear上,我连接观察者并用数据填充数组。 当视图已加载但仍未调用异步Firebase回调时,会出现此问题 - 表显示为空白。 该表在回调后刷新,看起来像预期,但延迟仍然很明显。 我已经配置了离线模式,并期望应该立即调用观察者的处理程序,但事实并非如此。
处理这个问题的正确方法是什么? 等待吧看起来不是最好的选择,因为它只有100ms左右,数据已经在设备上,我只有8行。 有什么解决方案吗? 谢谢!
观察代码:
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
refHandle = [areasRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
[self.arrayOfAreas removeAllObjects];
for (FIRDataSnapshot* areaSnapshot in snapshot.children){
Area *area = [[Area alloc] init];
[area retrieveFromSnapshot:areaSnapshot];
[self.arrayOfAreas addObject:area];
} [self.tableView reloadData];
}]; }
viewDidLoad中:
- (void)viewDidLoad {
[super viewDidLoad];
self.ref = [[FIRDatabase database] reference];
FIRUser *currentUser = [FIRAuth auth].currentUser;
areasRef = [[[_ref child:@"users"] child:currentUser.uid] child:@"areas"];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.tableFooterView = [[UIView alloc]init];
self.arrayOfAreas = [NSMutableArray new];
self.tableView.allowsMultipleSelectionDuringEditing = NO; }
答案 0 :(得分:1)
全新安装完应用后, 显然,从firebase获取数据会有延迟。 获取所有数据后,必须将其保存在本地数据库中。
从第二次开始,显示本地数据库中的数据并同时获取firebase数据库。 (如果您没有在提取路径的内部键值中进行更新/删除,则可以根据本地数据优化firebase数据库提取查询。)
如果要将本地DB数据保存到arrayOfAreas。您可以按如下方式更改观察块
NSMutableArray *arrayTemp = [[NSMutableArray alloc]init];
for (FIRDataSnapshot* areaSnapshot in snapshot.children){
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Area" inManagedObjectContext:[CoreData sharedData].context];
Area *area = [[Area alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
[area retrieveFromSnapshot:areaSnapshot];
[arrayTemp addObject:area];
}
/**
if you are fetching all datas again
*/
self.arrayOfAreas = arrayTemp;
[self.tableView reloadData];
/**
if you are fetching only the datas that are newly added (datas that are not existing in local DB)
*/
[self.arrayOfAreas addObjectsFromArray: arrayTemp];
[self.tableView reloadData];
如果您使用的是firebase离线功能,请尝试以下方式。 (这可能不是一个完美的解决方案)
在viewDidLoad或app launch中调用[FIRDatabase database].goOffline
。
一旦观察者块被执行,[FIRDatabase database].goOnline
。
答案 1 :(得分:0)
UITableview
已加载viewDidLoad
,因为您的tableView
空白时,您的数组中没有数据。
如果您不希望在检索数据之前加载tableView
,那么您可以在完成提取记录后分配datasource
和delegate
。 (在Firebase方法的完成块中)
您可以显示加载程序,直到检索到数据。