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

时间:2016-05-17 16:21:46

标签: firebase firebase-realtime-database

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

数据:

我有用户,当他们加入锦标赛时可以扮演玩家的角色:

"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 //锦标赛访问用户的锦标赛,使客户可以轻松地将其显示在列表中。 (好!)
  • 每个整个锦标赛将被复制到每个玩家的URL中。 (坏?)

可能的解决方案2:

Follow this approach,表示:

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

理论上,这个应用程序将有数以千计的锦标赛和用户,如果我们最终像解决方案1那样重复数据,我想这是需要注意的。

1 个答案:

答案 0 :(得分:1)

有许多解决方案,但这里的解决方案非常简单:

给出以下Firebase结构(将分数留下以简化)

tournaments
  t_3515 
    entry_fee:100
    status:Active
    players  
      p_3: true
      p_4: true
    status
      P_3: waiting
      P_4: accepted
    }
  }

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将为您提供更好的粒度与实际情况。