【问题标题】:Read data from Firebase is too Slow - iOS从 Firebase 读取数据太慢 - iOS
【发布时间】:2018-08-06 01:14:34
【问题描述】:

我正在使用 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;
}

【问题讨论】:

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


    【解决方案1】:

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

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

    1. 加载更少的数据。

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

    2. 尽快开始加载数据

      在新视图的动画开始之前,您可能已经开始为新视图加载数据。这样,数据在视图动画期间被加载,新视图的延迟会更短。

    3. 显示“请稍候”动画

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

    肯定有更多的技巧,但它们会越来越多地参与。如果你有兴趣:

    • 启用磁盘持久性

      这个其实很简单,就是set a flag。从那一刻起,Firebase 客户端将首先从本地磁盘缓存加载数据,然后将其与来自服务器的更新同步。但是这种方法的影响可能比您初始化时意识到的要大得多,因此我建议仅在上述步骤没有给出令人满意的结果时才这样做。

    • 保留本地快照

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

    【讨论】:

    • 你好,谢谢你的建议......我注意到这个延迟是因为我正在快速关注 youtube 上的教程......这是链接youtube.com/…......正如你所看到的查询以获取所有用户及其电子邮件的列表,并且上传速度非常快......因此我不明白我错在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多