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

标签 ios uitableview firebase firebase-realtime-database

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

相关文章:

ios - iPad 中 UITableView 分隔符两侧都有边距

firebase - 如何在 Flutter 中从 Firestore 订购数据,orderBy 订购不正确

ios - Xcode:只能归档一次聚合目标

ios - 伪元素后的 webkit-tap-highlight-color

ios - 缩放 ScrollView

ios - 在屏幕旋转之前自动布局约束不正确?

ios - 将选定行的值传递给 View Controller

ios - Accordion 表格单元格 - 用于展开和折叠 ios

firebase - 云函数错误 : function is not a valid feature. 必须是数据库、firestore、函数、托管、存储之一

javascript - Firebase 双向关系/检索数据