Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 关于有限查询引用上keepSynced(true)的几个问题_Ios_Swift_Firebase_Caching_Firebase Realtime Database - Fatal编程技术网

Ios 关于有限查询引用上keepSynced(true)的几个问题

Ios 关于有限查询引用上keepSynced(true)的几个问题,ios,swift,firebase,caching,firebase-realtime-database,Ios,Swift,Firebase,Caching,Firebase Realtime Database,我有一个Firebase支持的应用程序,具有以下数据库结构: posts /uid /postId 最初,我会使用ObserveEventOfType和.childAdded从posts/uid节点加载数据。这将同时为我的应用程序的所有用户频繁加载过时数据(每天约5次)。当试图通过发布新帖子来更新数据时,Firebase仍然会返回陈旧数据 因此,我决定尝试保持同步。现在,如果我的参考是这样的: reference = Database().database.r

我有一个Firebase支持的应用程序,具有以下数据库结构:

posts
      /uid
           /postId
最初,我会使用
ObserveEventOfType
.childAdded
posts/uid
节点加载数据。这将同时为我的应用程序的所有用户频繁加载过时数据(每天约5次)。当试图通过发布新帖子来更新数据时,Firebase仍然会返回陈旧数据

因此,我决定尝试保持同步。现在,如果我的参考是这样的:

reference = Database().database.reference.child("posts").child(uid)
keepSynced
将加载该节点上的所有数据,如果该节点中有许多子节点,则可能会导致大量下载。因此,我决定将引用/查询更改为:

reference = Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25)
为此节点启用
keepSynced
时,它会成功同步节点中最后25个子节点。然而,我仍然面临着频繁接收过时数据的问题。下面是我的问题:

  • 在有限查询上添加
    keepSynced
    模式时,它是仅从添加到的初始节点同步,还是始终仅同步该节点下的25个最新子节点

  • 在代码中添加
    keepSynced(true)
    行的最佳位置在哪里?在加载引用之前,在
    视图中将出现
    ,还是在实际下载回调中

  • 类似地,使用
    保持同步(false)
    的最佳位置在哪里

  • 当应用程序淡入后台时,
    keepSynced
    侦听器是否会删除

  • 为什么
    keepSynced
    有时不提供子更新的地址

  • 我目前在用于加载帖子的函数中使用了
    keepSynced(true)
    ,该函数在
    viewDidLoad
    上调用


    提前感谢。

    顾名思义
    keepSynced(true)
    将您调用的任何查询或引用在本地缓存中保持同步。它实际上只是将一个空的观察者附加到该查询/引用。因此,在
    Database().Database.reference.child(“posts”).child(uid).queryLimited(toLast:25)
    中,它将同步最后25个子节点,并保持同步(在添加新节点时删除以前的节点)

    如果反复侦听完全相同的数据,Firebase实时数据库缓存机制的工作最可靠。具体地说,附加到
    数据库().Database.reference.child(“posts”).child(uid)
    侦听器可能看不到通过
    数据库().Database.reference.child(“posts”).child(uid).queryLimited(toLast:25)
    缓存的数据。这是因为Firebase客户端保证不会为部分更新触发事件,在本例中,它不能保证它拥有来自第一次引用的所有数据

    关于您的问题:

  • 见上文

  • 视图中添加它们是最常见的,它将出现

  • 我不知道你为什么要调用
    keepSynced
    false,所以不能推荐任何东西

  • 不确定这是否是您的意思,但是
    keepSynced(true)
    不会在应用程序运行之间持久化。因此,每次应用程序/视图启动时,您都必须调用
    keepSynced(true)

  • 见上文


  • 一般来说,您似乎试图通过以不同的方式调用API来绕过API的工作方式。我通常不会从中看到好的结果。如果您希望应用程序的行为与API不同,请考虑创建一个自定义包装器,并缓存数据。

    你好,弗兰克,谢谢您的回复。我有点困惑:您说过KeepSync将同步最后25个子节点。这是真实的,当我在网页上观察帖子时,它会实时更新。但是,在刷新应用程序(关闭和重新打开)时,引用没有正确同步最后25个节点,并且加载了过时的数据。由于您询问了
    keepSynced()
    的工作原理,我回答了您所有的问题。如果您看到的行为与(您认为的)API的工作方式不匹配,请编辑您的问题以包括以下内容。这是知道我们在看相同的行为和代码的唯一方法。这里的独立意味着:1)尽可能使用硬编码值,2)日志输出,而不是用户界面。感谢您提供的信息,弗兰克,我没有很好地看到答案,因为当时我在车里。只是澄清一下——我调用keepSynced(false),这样节点就不会在我不需要的页面之外保持同步。除非我误解了什么,否则我认为保持同步会浪费带宽。在问题4中,进入后台意味着将应用程序保留在后台,但不终止进程并转到其他应用程序。更新:我解决了我的问题。事实证明Firebase并没有返回过时的数据;它返回了正确的数据,但我的查询是基于这样的假设,即所有自动生成的键都是按某种类型的顺序预先排序的。原来不是。很高兴听到你发现了问题卡塔斯!