我创建了简单的 UITableView,其中有几行是从 Firebase 加载的。 在 viewWillAppear 上,我连接观察者并用数据填充数组。 问题发生在 View 已加载但仍未调用异步 Firebase 回调时 - 表格显示为空白。 表格在回调后刷新,看起来像预期的那样,但延迟仍然很明显。 我已经配置了离线模式,并期望应该立即调用观察者的处理程序,但事实并非如此。
处理该问题的正确方法是什么? 等待栏看起来不是最好的选择,因为它只有 100 毫秒左右,而且数据已经在设备上,而我只有 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; }
最佳答案
全新安装您的应用后, 显然,从 firebase 获取数据会有延迟。 获取所有数据后,您必须将其保存在本地数据库中。
从第二次开始,显示本地数据库中的数据并同时获取 firebase 数据库。 (如果不更新/删除抓取路径的内键值,可以根据本地数据优化firebase DB抓取查询)。
如果您要将本地数据库数据保存到 arrayOfAreas。您可以按如下方式更改观察 block
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 或应用启动时调用 [FIRDatabase 数据库].goOffline
。
一旦观察者 block 执行,[FIRDatabase 数据库].goOnline
。
关于ios - 在从 Firebase 加载数据之前,UITableView 显示为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45669481/