Firebase数据结构,订阅引用对象

Firebase数据结构,订阅引用对象,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,从我读到的关于在Firebase(,)中保留“引用”的文章中,我无法理解,如果我们需要听取所有引用对象的属性,那么引用其他对象的最佳方式是什么 数据: 我有一些用户,当他们参加比赛时,他们可以扮演玩家的角色: "t_3515":{ "entry_fee":100, "status":"Cancelled", "players":{ "p_3":{ "player_name":"User A", "score":"0",

从我读到的关于在Firebase(,)中保留“引用”的文章中,我无法理解,如果我们需要听取所有引用对象的属性,那么引用其他对象的最佳方式是什么

数据:

我有一些用户,当他们参加比赛时,他们可以扮演玩家的角色:

"t_3515":{  
   "entry_fee":100,
   "status":"Cancelled",
   "players":{  
      "p_3":{  
         "player_name":"User A",
         "score":"0",
         "status":"Waiting"
      },
      "p_4":{  
         "player_name":"User B",
         "score":"0",
         "status":"Accepted"
      }
   }
}
我有一个系统所有比赛的名单

如何显示此数据:

  • 一个显示/收听“所有”锦标赛列表的屏幕
  • 一个屏幕显示/收听登录用户所属的锦标赛
我正在寻找(在性能方面)为这两个需求构建数据的最佳方法


可能的解决方案1:

为每位球员复制每场比赛,这意味着:

  • 使用firebaseURL//tournaments访问用户的比赛,使客户端可以轻松地将其显示在列表中。(好!)
  • 每个完整的比赛将被复制到每个球员的URL中。(坏?)
可能的解决方案2:

,即:

  • 要访问用户的锦标赛,客户端应订阅firebaseURL//tournaments(以了解何时添加/删除锦标赛),然后迭代每个锦标赛,查找其原始数据的URL,然后订阅。(可怕的)
  • 锦标赛的数据将只保存在一个地方。(好)


从理论上讲,这个应用程序将有数千个锦标赛和用户,如果我们最终像解决方案1那样复制数据,我想这是需要记住的。有很多解决方案,但这里有一个非常简单:

给定以下Firebase结构(省略分数以简化)

1) 一个显示/收听“所有”锦标赛列表的屏幕

当用户在观察所有锦标赛的屏幕上时,请执行以下操作

ref = tournaments

ref.observeEventType(.Value, withBlock: { snapshot in
    print(snapshot)
    //note that Value returns the entire contents of the node so this is not
    //  the best approach. It's here for conceptual. See note below.
})
这将通知应用程序在锦标赛中更改的任何节点

2) 一个屏幕显示/收听登录用户所属的锦标赛

当用户在屏幕上只观察他们参加的锦标赛时,请执行以下操作:假设用户是p_3,希望查看他们参加的锦标赛:

ref = tournaments

ref.queryOrderedByChild("players/p_3").queryEqualToValue(true)
        .observeEventType(.Value, withBlock: { snapshot in
    print(snapshot)
})
在屏幕之间切换时,停止观察先前的屏幕

ref.removeAllObservers

现在,为了深入了解,您可能不想使用.Value来附加您的观察者。ChildAdded、.ChildChanged和.ChildRemoved将使您对实际发生的事情有更好的粒度。

为什么要保留引用?如果您正在观察一个节点,它将告诉您是否有任何更改。例如用户_A登录并查看所有锦标赛屏幕(正在观察锦标赛节点)。用户_B将启动一个新的锦标赛。用户_A将自动收到该事件的通知,以便您可以更新其比赛以显示该事件。如果用户_A然后切换到My Tournaments屏幕,这是代码中的一个简单过滤器,只显示他们所参加的比赛。挑战在于构建Firebase数据。你能用你想对参考资料做什么来更新你的问题吗?@Jay,“切换到我的锦标赛屏幕,这是代码中的一个简单过滤器,只显示他们参加的锦标赛”。我目前正在观察所有锦标赛的url,当切换到“我的锦标赛”时,我会循环它们以获取用户的部分,但在iOS和Android上都变得非常慢,因为有数百个锦标赛。您是否建议使用Firebase查询执行此操作?我需要实时更新“我的锦标赛”,这就是为什么我需要订阅每个用户的锦标赛。虽然从技术上讲,你可以用Firebase来完成这项工作,但这需要大量的额外工作,而且循环效率非常低。使用NSPredicate进行筛选,结果是所需锦标赛的数组,然后使用该数组更新tableView。NS谓词将在几分之一秒内过滤数千个索引。看这个。尝试使用NSPredicate编写一些代码进行过滤,如果您遇到问题,请告诉我们,以便我们提供帮助。谢谢@Jay,但我同时使用Android和iOS,目前我不想在客户端寻找解决方案,我认为必须有一种正确的方法来解决此问题,而不依赖于每个客户端的实现。
ref.removeAllObservers