【问题标题】:Does firebase web client download data every time I subscribe for a certain database path?每次我订阅某个数据库路径时,firebase Web 客户端都会下载数据吗?
【发布时间】:2019-02-09 09:45:05
【问题描述】:

在我的 Angular 应用程序中,我使用 AngularFire 访问 firebase 实时数据库。

我有以下方法来检索某个数据库路径中的实体。

private db: AngularFireDatabase;

public getAll(): Observable<Item[]> {
    return this.db.list<Item>('some/db/path').valueChanges();
}

如果我多次调用上述方法,数据会从服务器多次下载,还是 firebase 客户端第二次使用本地缓存?

如果数据被多次下载,有什么方法可以指示 firebase 客户端使用本地缓存?

【问题讨论】:

    标签: angular firebase firebase-realtime-database


    【解决方案1】:

    Firebase 实时数据库客户端对侦听器进行重复数据删除。这意味着:

    this.db.list<Item>('some/db/path').valueChanges();
    this.db.list<Item>('some/db/path').valueChanges();
    

    上面的代码最初只会下载一次数据,每次更改只下载一次增量。

    请注意,您可以通过查看浏览器网络面板中的 Web Socket 流量自行检查。

    【讨论】:

    • 感谢您的回答。与此没有直接关系,但我还有另一个疑问。如果我在 android 客户端中启用了持久性,如果某个 db 路径的数据已经被缓存,当 android 应用程序重新启动时,如果我订阅该路径的值更改,将 firebase 再次下载该路径的所有数据,或者它只会下载缓存和服务器之间的差异吗?
    • 在这种情况下,它会执行所谓的增量同步。这意味着它计算已缓存数据的哈希值,并将其发送到服务器。然后服务器只发回修改过的数据。这种方法不能保证最小(这意味着客户端必须发送每个值的哈希),但通常比发送所有数据要小很多。
    • 很高兴听到这个消息。另外,我在几个地方读到,如果我在 android 客户端中的某个路径上使用 keepSynced(),firebase 将在每次应用重启时下载该路径的所有数据。但是,根据您描述的这种机制,应该没有必要这样做。我说的对吗?
    • 正确。您可以查看debug logs 以了解电线上实际发生的情况。尤其是散列是很有教育意义的,虽然有点难以理解。
    猜你喜欢
    • 2019-02-20
    • 2019-01-12
    • 2019-12-04
    • 2021-10-14
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多