OGeek|极客世界-中国程序员成长平台

标题: ios - 如何从 Firebase 获取一组对象? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 19:45
标题: ios - 如何从 Firebase 获取一组对象?

在我的 React-Native 应用程序中,我有一组特定用户,我想从 Firebase 中提取他们的值。解决此问题的最有效方法是什么?目前我正在遍历数组并为每个数组发出一个新请求(下面的相关代码):

const usersRef = new Firebase(`${ config.FIREBASE_ROOT }/users`)

for (var key in usersArray) {
     var userRef = usersRef.child(key);
     //do stuff here
}

但是,我觉得这不是很有效,它会向数据库发出多个请求。有没有一种方法可以在一次调用中传入数组并从 Firebase 获取这些项目?谢谢。

Firebase 数据结构:

{
  "items" : [ {
    "description" : "fuzzy socks",
    "type" : "toy"
  }, {
    "description" : "bouncy ball",
    "type" : "toy"
  }, {
    "description" : "scrabble",
    "type" : "game"
  }, {
    "description" : "construction paper",
    "type" : "crafts"
  } ],
 "users" : [ {
    "itemList" : [ 1, 2, 3, 4 ],
    "description" : "brown",
  }, {
    "itemList" : [ 5, 6, 7 ],
    "description" : "green",
  }, {
    "itemList" : [ 8, 9, 10 ],
    "description" : "blue",
  }, {
    "itemList" : [ 11, 12, 13 ],
    "description" : "yellow",
  } ]
}

简化用例:在一个用例中,我只想获取有关 2 个用户的信息(在我存储在 Firebase 中的所有用户中——假设它不仅仅是上面结构中的 4 个)。所以,我有数组 importantUsers:

var importantUsers = [0, 3]

然后,我想向 Firebase 发送一个请求,该请求仅在数据库中查询与这些 userID 值关联的值(因此以某种方式将数组传递给 Firebase 以获得结果)。返回值是这样的:

0: itemList: [1,2,3,4], description: brown
3: itemList: [11,12,13], description: yellow

我一次查询多个用户的数据库(而不是为用户 0 和用户 3 创建单独的引用)的动机是不要多次调用 Firebase。有没有办法解决这个问题?



Best Answer-推荐答案


所以你所追求的是一个 sql 'in' 类型的查询。在 [0,2] 中选择。从列表中选择多个用户。

您问题中的另一个挑战是您感兴趣的用户是随机的,因此您不能使用 .startAt 和 .endAt,并且用户之间没有其他关系。

Firebase 不直接支持“in”、“and”或“or”类型的查询,但有多种方法可以实现。

怎么样:标记你想要的用户,然后用一个查询,读入他们。

首先,您将从一个典型的 Firebase/users 节点开始,并添加一个“选定”子节点(最初可以省略,但我在这里将其显示为占位符)

users
 uid_0
   name: "Bud"
   selected: false
 uid_1
   name: "Henry"
   selected: false
 uid_2
   name: "Billy"
   selected: false

然后,我们需要一些随机的 uid,比如 uid_0 和 uid_2,并将它们存储在一个数组中。请记住,我们将使用 Firebase 生成的 uid,但为了简单起见,我们将使用 uid_0、uid_1 等。

只有两个用户,您可以在两个节点上分别观察SingleEventOfType,没什么大不了的。

但是,如果我们需要 100 个随机用户或 1000 个用户,则应避免执行 1000 个单独的查询或observeSingleEvent。但是,setValue 非常快(没有返回数据)所以....

获取我们的用户引用

let usersRef = myRootRef.ChildbyAppendingPath("users")

我们通过遍历数组来构建这些 ref 并将 selected 设置为 true,从而知道我们想要的 100 个用户的路径

for uid in uidArray {
  let thisUserRef = usersRef.childByAppendingPath(uid)
  let selectedRef = thisUserRef.childByAppendingPath("selected")
  selectedRef.setValue(true)
}

然后,您可以在 usersRef 中查询选定的 child = true 的所有用户。

一旦你有了它们,清理,迭代返回的用户并将 selected 设置为 false 或 nil

这很酷的一点是,setValue 可以非常快速地通过 100 或 1000 个用户而没有开销,将他们选择的 child 设置为 true。然后一个查询就可以返回你想要的值。

写出然后读回的逻辑似乎几乎是相反的,但我很确定这比遍历数组并生成 1000 个查询或观察者要好得多。

(Firebase 的人可以检查我的那个)

另一个想法是,如果用户说,单击列表中的其他用户,您可以在他们单击时设置 selected = true,然后在用户完成时查询这些用户。

关于ios - 如何从 Firebase 获取一组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053906/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4