从Firebase读取数据太慢 - iOS

时间:2018-02-26 14:36:23

标签: ios objective-c firebase firebase-realtime-database uicollectionview

我正在使用Firebase来管理我的应用数据。

到目前为止,Firebase似乎非常适合管理数据,但是当我需要从数据库中读取数据时,我遇到了问题。

要从我的Firebase数据库中读取数据,请执行此功能

[[[[FIRDatabase database] reference] child:@"Region"] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

        [_regionList addObject:snapshot.value[@"name"]];
        [self.collectionView reloadData];
}];

以正确的方式收集数据,但问题是它看起来有点慢......

让你明白更好......

我必须在UICollectionView中查看我的数据..问题是在查看UICollectionView和收集的数据之间似乎有一点延迟......你可以举一个例子从我在下面发布的视频中看到它..

VIDEO

你能告诉我我的错误在哪里吗?我似乎已经完成了所有事情,但我不理解读取数据的这种延迟

这是我的代码

- (void)viewDidLoad {
    [super viewDidLoad];
    _regionList = [[NSMutableArray alloc] init];
    _reference = [[DatabaseReference alloc] init];
    [self fetchRegion];
}

-(void)fetchRegion {
    [[[[FIRDatabase database] reference] child:@"Region"] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

        [_regionList addObject:snapshot.value[@"name"]];
        [self.collectionView reloadData];

    }];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return self.regionList.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    ChooseRegionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    cell.regionName.text = self.regionList[indexPath.item];

    return cell;
}

1 个答案:

答案 0 :(得分:2)

数据是从Firebase服务器异步加载的。虽然这很好,但因为这意味着您始终在查看最新数据,这也意味着可能需要一些时间才能获得数据。

使这种延迟(似乎)更短的典型方法:

  1. 加载较少的数据。

    加载数据所需的时间取决于3个因素:Firebase服务器的延迟,加载的数据量以及加载数据的带宽。由于您无法控制用户的连接速度或延迟,因此您可以控制的唯一因素是加载的数据量。加载较少的数据会缩短延迟时间。

  2. 尽快开始加载数据

    您可能已经开始加载新视图的数据,然后动画开始到新视图。这样就可以在视图动画期间加载数据,并且新视图的延迟会更短。

  3. 显示"请等待"动画

    另一个解决方案是显示"请等待"新视图中用户的动画或横幅。这可以是视图的静态元素的一部分,然后在可用时将其替换为实际数据。

  4. 肯定有更多技巧,但他们越来越多地参与进来。如果您对此感兴趣:

    • 启用磁盘容量

      这实际上很简单,只是set a flag。从那时起,Firebase客户端将首先从本地磁盘缓存加载数据,然后将其与来自服务器的更新同步。但是这种方法的含义可能比你初步认识到的要大很多,所以如果上述步骤不能给出满意的结果,我建议只做这个。

    • 保留本地快照

      一种简单的方法是将最后一个视图内容的屏幕截图保留在应用的本地缓存中,然后在新视图出现时立即显示。当用户正在扫描此日历时,正在从服务器加载数据并进行更新。如果渲染数据需要花费非常少的时间,这通常是一种很好的方法。