【问题标题】:remove firebase observer from database node in unity c#?从统一 c# 中的数据库节点中删除 firebase 观察者?
【发布时间】:2020-06-26 21:48:53
【问题描述】:

我的 playerRef 子节点中的这个 firebase 观察者为:

playersRef = FirebaseDatabase.DefaultInstance.GetReference("players");
playersRef.OrderByChild("level") .ValueChanged += (object sender2, ValueChangedEventArgs e2) => {}

现在,当我的游戏对象被销毁时。 我想在 playerRef 上删除这个观察者,它会在一些值更改时被调用。

问题: 我找不到任何方法让这个观察者保持沉默。与其他语言一样,firebase 允许我们像这样删除AllObservers():

 ref.removeAllObservers()

但是,在通过 firebase 文档进行统一 C# 搜索时,我看不到删除观察者的选项。 https://firebase.google.com/docs/reference/unity/class/firebase/database/database-reference

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database observers


    【解决方案1】:

    答案就在这个link,您可以使用(-)运算符取消订阅该事件。

    【讨论】:

      【解决方案2】:

      只是为了扩展上一个答案。您需要执行以下操作:

      1)实际命名处理事件的函数(以便您稍后可以-=它):

      private void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      }
      

      2) 缓存对您将使用 ValueChanged 的​​查询的引用:

      Query _cachedQuery;
      
      void Start() {
          playersRef = FirebaseDatabase.DefaultInstance.GetReference("players");
          _cachedQuery = playersRef.OrderByChild("level");
          _cachedQuery.ValueChanged += HandleValueChanged;
      }
      

      3) 完成后,移除监听器。对于奖励积分,检查它是否为非空(即:如果您使用 Start 而不是 Awake,这将处理对象在第一次更新循环之前调用了 DestroyImmediate 的情况)。

      void OnDestroy() {
          if (_cachedQuery != null) {
              _cachedQuery -= HandleValueChanged;
              _cachedQuery = null;
          }
      }
      

      C# 本身通常不允许您从事件中“删除所有”(尽管您可以work around this)。但是,如果您习惯了这种模式或者(像我一样)更喜欢在UnityEvents 中工作,那么您总是可以在公开UnityEvent 的类中完成所有这些工作。然后你可以在你创建的这个代理类上调用RemoveAllListeners(虽然我认为RemoveAll是我个人风格的“代码味道”,但由每个团队决定他们做什么而不考虑好的代码) .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多