Firebase 离线功能和 addListenerForSingleValueEvent

2023-12-14

每当我使用addListenerForSingleValueEvent with setPersistenceEnabled(true),我只能设法获得本地离线副本DataSnapshot and NOT更新后的DataSnapshot从服务器。

但是,如果我使用addValueEventListener with setPersistenceEnabled(true),我可以获得最新的副本DataSnapshot从服务器。

这是正常的吗addListenerForSingleValueEvent因为它只搜索DataSnapshot本地(离线)并在成功检索后删除其侦听器DataSnapshot ONCE(离线或在线)?


更新(2021): There is一个新的方法调用(get在安卓上 and getData on iOS)实现您想要的行为:它首先尝试从服务器获取最新值,并且仅在无法到达服务器时才回退到缓存。使用持久侦听器的建议仍然适用,但至少有一个更清晰的选项可以一次性获取数据,即使您启用了本地缓存。


坚持是如何发挥作用的

Firebase 客户端会在内存中保留您正在监听的所有数据的副本。一旦最后一个侦听器断开连接,数据就会从内存中刷新。

如果您在 Firebase Android 应用程序中启用磁盘持久性:

Firebase.getDefaultConfig().setPersistenceEnabled(true); 

Firebase 客户端将保留应用程序最近侦听的所有数据的本地副本(在磁盘上)。

当你附加一个监听器时会发生什么

假设您有以下内容ValueEventListener:

ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        System.out.println(snapshot.getValue());
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
        // No-op
    }
};

当您添加一个ValueEventListener到一个位置:

ref.addValueEventListener(listener); 
// OR
ref.addListenerForSingleValueEvent(listener); 

如果该位置的值在本地磁盘缓存中,Firebase 客户端将调用onDataChange()立即从本地缓存中获取该值。然后还会向服务器发起检查,以请求对该值进行任何更新。它may随后调用onDataChange()如果服务器上的数据自上次添加到缓存以来发生了更改,则再次执行此操作。

当你使用时会发生什么addListenerForSingleValueEvent

当您将单值事件侦听器添加到同一位置时:

ref.addListenerForSingleValueEvent(listener);

Firebase 客户端将(像之前的情况一样)立即调用onDataChange()获取本地磁盘缓存中的值。它会not调用onDataChange()即使服务器上的值不同,也可以多次。请注意,后续请求时仍会请求并返回更新的数据。

这在之前的文章中已经介绍过Firebase 同步如何使用共享数据?

解决方案和解决方法

最好的解决方案是使用addValueEventListener(),而不是单值事件侦听器。常规值侦听器将从服务器获取即时本地事件和潜在更新。

第二种解决方案是使用新的get method(于 2021 年初推出),不存在这种有问题的行为。请注意,此方法始终尝试首先从服务器获取值,因此需要更长的时间才能完全获取。如果你的值永远不会改变,那么使用可能仍然更好addListenerForSingleValueEvent(但在这种情况下您可能不会最终到达此页面)。

作为解决方法,您还可以call keepSynced(true)在使用单值事件侦听器的位置。这确保了数据在发生变化时都会更新,从而大大提高了单值事件侦听器看到当前值的机会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 离线功能和 addListenerForSingleValueEvent 的相关文章

随机推荐

  • 在 UNIX 中重命名批量文件

    我有一组文件如下 旧名称 1 txt 旧名称 1 pdf 旧名称 1 bak 等等 每个都有不同的扩展名 我需要将 oldname 重命名为 newname 所以我尝试了 rename v s oldname newname oldname
  • CURLOPT_FOLLOWLOCATION 不起作用

    我正在尝试通过此链接抓取数据 http www treasurydirect gov NP BPDLogin application np 其中包含元刷新 我正在使用curl exec 并将CURLOPT FOLLOWLOCATION 设置
  • 删除 StringBuilder 的最后一个字符?

    当您必须循环遍历集合并使用分隔符分隔每个数据的字符串时 最后总会有一个额外的分隔符 例如 for String serverId serverIds sb append serverId sb append 给出类似的东西 服务器Id 1
  • PHP JavaScript?当用户关闭页面或浏览器时执行某些操作[重复]

    这个问题在这里已经有答案了 可能的重复 如果用户关闭浏览器窗口或离开 php 页面 如何销毁会话 基本上我想通过更新我的 MySQL 数据库将我的用户设置为 离线 并可能在他们关闭浏览器或页面时结束他们的会话 我见过一个网站是这样做的 谁能
  • 如何消除不透明褪色中未使用的参数?

    element被调用但从未使用过 它们只是被传递回另一个函数调用 这看起来有点浪费 有更好的方法吗 初次通话 fadeUp document getElementById test 3000 将元素的不透明度淡化 3000 毫秒 funct
  • 主干模型中如何处理“更改”事件?

    我正在尝试构建一个动态更新 Meteor 项目中的会话变量的模型 我知道纯 JSON 不应该存储在骨干模型中 所以我设置了一个特殊模型 如下所示 initialize function Log the changed properties
  • Android中Thread.currentThread().getId()和Process.myTid()的区别

    据了解 myTid 返回调用线程的标识符 与 setThreadPriority int int 一起使用 但我发现Thread currentThread getId 不等于Process myTid 所以 我猜测前者是 JVM 版本的线
  • 生成字母表中的字母数组

    有没有一种简单的方法可以在 C 中生成包含字母表字母的数组 手工完成并不难 但我想知道是否有内置的方法可以做到这一点 我不认为有内置的方法 但我认为最简单的方法是 char alpha ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • MongoDB 不会使用 Mongoid 连接到 MongoHQ

    我刚刚开始一个全新的 Rails 项目 我想要完成的第一个任务是创建一个对象并将其保存在我的数据库中 我通过自动方式生成了一个对象 在本例中是一个 URL 对象 如下所示 rails generate scaffold Url domain
  • 如何在Mac上设置PYTHON_EGG_CACHE环境变量?

    我正在尝试设置 Django 以使用 MySQL 当我输入时出现以下错误localhost mysite ExtractionError at Can t extract file s to egg cache The following
  • Google Maps IOS SDK 1.2 需要地图视图快照

    在 1 1 中 GMSScreenshot 类提供了一种将整个屏幕的快照获取到 UIImage 中的基本方法 在 1 2 中 该类丢失了 在发行说明中 它是这样说的 在 GMSMapView 图层上调用 renderInContext 现在
  • 声明一个引用并稍后初始化?

    我有一些课程的参考MyObject 但确切的对象取决于条件 我想做这样的事情 MyObject ref if condition ref MyObject something else ref MyObject something else
  • Julia:使用许多不同但相关的算法选择来构建代码

    我正在寻找一种优雅的方式来重新安排我的代码 对于开发求解器 您可能会拥有许多具有相同设置的不同选项 例如 从高层次来看 代码看起来像这样 function solver Start by assigning a bunch of varia
  • REQUEST_DENIED 响应 Google Places API 请求 (sensor=true)

    我正在尝试使用 Google Places API 获取我所在位置周围的地点 以下是用于点击 URL 进行地点搜索的代码 NSString URL NSString stringWithFormat https maps googleapi
  • 在哪里/如何从 Google Maps API 获取多边形数据?

    我真的很想简短地回答这个问题 所以 我想知道谷歌地图是否拥有详细信息 在这种情况下我需要多边形 坐标数组 对于城市内的特定市政府 即Envigado在城市Medellin Co 有没有办法获取这种类型的数据 编辑 我不确定谷歌地图是否显示我
  • 如何解码 .dxf 文件?

    我想将 dxf 文件内的绘图转换为 g 代码 有一些工具可以做到这一点 但我想自己编写代码 因此 第一部分是解码 dxf 格式 然而 dxf 文件的内容看起来并不容易破译 我下载了一个 dxf 文件here并在文本编辑器中打开它 我也指的是
  • MongoDB $pull 语法

    我有一个 希望 小语法问题 pull在 Mongodb 中 bulk find id new mongo ObjectID req session id updateOne pull firstArray id req params id
  • C++:如何根据条件选择构造函数?

    假设我有一个具有不同构造函数的类 class A public A char string A int value void check 现在我想在堆栈上创建一个 A 对象 必须根据某些条件选择构造函数 但有一个问题 创建的对象被销毁然后我
  • Blazor WASP 应用程序(ASP.NET Core 托管)尝试从我的 appsettings.json 文件获取设置值

    我在尝试从 appsettings json 文件获取设置时遇到问题 我设置了一个名为 FileStorage 的本地路径 这是我的文件 我的 appsettings json 文件 Logging LogLevel Default Inf
  • Firebase 离线功能和 addListenerForSingleValueEvent

    每当我使用addListenerForSingleValueEvent with setPersistenceEnabled true 我只能设法获得本地离线副本DataSnapshot and NOT更新后的DataSnapshot从服务