在从Firebase加载数据之前,UITableView显示为空白

时间:2017-08-14 07:31:23

标签: ios uitableview firebase firebase-realtime-database

我创建了简单的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; }

2 个答案:

答案 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,那么您可以在完成提取记录后分配datasourcedelegate。 (在Firebase方法的完成块中)

您可以显示加载程序,直到检索到数据。