2017-08-14 91 views
0

我已经使用从Firebase加载的几行创建了简单的UITableView。 在viewWillAppear我连接观察员并使用数据填充数组。 问题发生在视图已经加载但异步Firebase回调仍然没有被调用 - 表显示为空白。 表格在刷新后刷新,看起来像预期的那样,但延迟仍然很明显。 我已经配置了离线模式,并希望那个观察者的处理程序应该立即被调用,但它不会。从Firebase加载数据之前,UITableView显示为空白

什么是正确的方法来处理? 等待酒吧看起来不是最好的选择,因为它只是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

你在Storyboard中分配了数据源和委托吗? –

+0

并分享您的代码,以便我们可以查看它并更好地了解您的情况。 –

+0

感谢提问,我已将其分配给viewDidLoad –

回答

0

UITableview是越来越装上viewDidLoad,因为会有你数组中没有数据在最初的tableView是空白。

如果你不希望加载tableView,直到您检索数据,那么你可以指定你的datasourcedelegate您完成抓取您的记录后。 (在Firebase方法的完成区块中)

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

+0

谢谢你的建议!数据已经加载,因为一切都在飞行模式下运行,我打开了离线存储。当数据已经添加到数组时,我刚刚试图分配数据源和委托 - 不幸的是,TableView仍然显示为没有数据。我不想添加加载指示器,因为数据已经存在。 –

0

全新安装完您的应用程序后, 显然,从Firebase获取数据会有延迟。 一旦您获取所有数据,您必须将其保存在本地数据库中。

从第二次开始,从本地数据库显示数据并同时获取firebase DB。 (如果您不更新/删除获取路径的内部键值,则可以根据本地数据优化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脱机功能,请尝试以下方法。 (它可能不是一个完美的解决方案)

invoke [FIRDatabase database].goOffline in viewDidLoad或app launch。 一旦执行观察程序块,[FIRDatabase database].goOnline

+0

谢谢你的回答!我如何显示本地数据库的数据? –

+0

似乎你正在使用核心数据。但我没有找到任何保存上下文的代码。解释需要很长时间。如果你对ping我有兴趣[email protected] –

+1

我实际上并没有使用CoreData,我只是初始化CoreData的NSManagerObject并填充快照。我不保存上下文等。为了使数据可以脱机使用,我使用[FIRDatabase数据库] .persistenceEnabled = YES; –