【问题标题】:Listen to items added on hundred of children in Firebase在 Firebase 中收听数百个孩子添加的项目
【发布时间】:2016-04-15 19:38:56
【问题描述】:

我有一个 iOS 市场应用程序,我在该应用程序中监听在该市场上出售的每件商品的变化。更准确地说,我正在倾听该项目上的孩子是否改变或被移除。

问题是我也想听听何时添加了孩子。在 Firebase 上添加子节点时进行监听的特殊之处在于,当您第一次设置监听器时,您会获得该节点上的所有兄弟节点。

一个项目上的孩子不是同一项目的列表,所以我无法监听在某个时间戳之后添加的孩子。我正在考虑做something like this 并忽略那些最初的孩子。这似乎是一个很大的浪费,因为我基本上是从 Firebase 获取东西两次。一次是FEventTypeValue,一次是FEventTypeChildAdded

我要收听的项目是在提要中加载的项目。它很可能是几百个项目,但也可能是数千个项目。

你会怎么做呢?我应该忘记所有关于倾听添加的孩子的事情还是有一个不错的解决方案?

编辑(添加示例代码):

这就是我在 Firebase 上获取特定项目数据的方式。

var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.child('listings/-KB9ZqLZBEskoUihb-yR').once('value', function(snapshot) {
  listing = snapshot.val();
});

在这里我想听听何时将新孩子添加到该项目:

ref.child('listings/-KB9ZqLZBEskoUihb-yR').on('child_added', function(snapshot) {
  listing[snapshot.key()] = snapshot.val()
});

问题是监听该节点上添加的项目会再次获取所有子节点,这似乎是一种巨大的浪费。你会如何处理这种情况?

【问题讨论】:

  • 这里描述代码和数据的文字太多了。请提供重现您所询问情况的实际代码和 JSON(作为文本,无屏幕截图)。见MCVE
  • 'listings/-KB9ZqLZBEskoUihb-yR' 是特定项目吗?是否有子节点被添加到 within 节点中,或者您是否正在寻找要与 listings 节点一起添加的其他项目。一些 Firebase 结构真的可以帮助我们,也许可以澄清一些问题。
  • 'listings/-KB9ZqLZBEskoUihb-yR' 是一个特定项目,我想听听何时将儿童添加到该特定项目。
  • 为什么不能只观察 .ChildAdded、.ChildChanged 和 .ChildRemoved?您是正确的,当添加 .ChildAdded 侦听器时,它会遍历所有子级,但我认为您希望它填充您的 UI。忽略比您提到的时间戳更早的那些并添加之后的那些。您甚至可以设置 .childAdded 查询以仅检索晚于时间戳的节点。您发布的代码也是重复的工作。只需使用 .childAdded ,它将在相关节点中读取,您不需要两者。 (也检查你的语法)
  • 我没有为某个节点上的每个子属性设置时间戳。所以我不能听一段时间后添加的孩子!我完全理解我可以收听我的孩子后添加的孩子。我的问题是我将两次获取相同的属性。那有意义吗?您了解案例和问题吗?

标签: ios iphone database firebase


【解决方案1】:

Firebase 当然支持将新添加的子节点检索到特定节点。

这是firebase documentation for retrieving data,您可以再次查看“添加的孩子”部分。我只是从那里引用一些重要的注释。

child_added 为每个现有的孩子触发一次,然后再次触发 每次将新的孩子添加到指定路径时

还有这个

出于排序目的,它还传递了第二个参数,其中包含 前一个孩子的钥匙。

您也可以查看示例。

// If we wanted to retrieve only the data on each new post added to our blogging app, we could use child_added

// Get a reference to our posts
var ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");
// Retrieve new posts as they are added to our database
ref.on("child_added", function(snapshot, prevChildKey) {
  var newPost = snapshot.val();
  console.log("Author: " + newPost.author);
  console.log("Title: " + newPost.title);
  console.log("Previous Post ID: " + prevChildKey);
});

仔细看看prevChildKey

因此,在这里您可以通过稍微更改数据库结构(suggested here)来实现此技巧。但是,我认为你已经有了这种排序结构。希望能帮助到你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多