我创建了简单的UITableView,其中包含从Firebase加载的几行。
在viewWillAppear上,我连接观察器并用数据填充数组。
当视图已加载但未调用异步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。您可以按以下方式更改观察块

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 database].goOffline
一旦观察者块执行,[FIRDatabase database].goOnline

关于ios - 从Firebase加载数据之前,UITableView显示为空白,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45669481/

10-10 21:07
查看更多