удалить firebase наблюдателя из узла базы данных в единстве c#? - PullRequest
0 голосов
/ 15 марта 2020

Я получил этого наблюдателя в своей дочерней нуле PlayersRef как:

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

Теперь, когда мой игровой объект уничтожен. Я хочу удалить этого наблюдателя в playerRef, который вызывается при некоторых изменениях значений.

ПРОБЛЕМА: Я не могу найти способ заставить этого наблюдателя замолчать. Как и в других языках, firebase позволяет нам удалить AllObservers (), например, как:

 ref.removeAllObservers()

Но в единстве C# поиск по firebase делает c, я не вижу возможности удалить наблюдателей. https://firebase.google.com/docs/reference/unity/class/firebase/database/database-reference

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Просто чтобы расширить предыдущий ответ. Вы захотите сделать следующее:

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) Когда вы закончите, удалите слушателя. Для получения бонусных баллов проверьте, не является ли оно ненулевым (ie: если вы используете Start вместо Awake, это будет обрабатывать случай, когда объект вызывал DestroyImmediate до первого обновления l oop).

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

C# само по себе обычно не позволяет вам «удалить все» из события (хотя вы можете обойти это ). Но если вы привыкли к этому шаблону или (как и я) предпочитаете работать в UnityEvent с, вы всегда можете сделать все это в классе, который предоставляет UnityEvent. Затем вы можете вызвать RemoveAllListeners для этого создаваемого вами прокси-класса (хотя я бы посчитал RemoveAll «запахом кода» в своем личном стиле, каждая команда должна решать, что они делают, а что нет). рассмотреть хороший код).

0 голосов
/ 15 марта 2020

Ответ лежит в этой ссылке , вы можете отписаться от события, используя (-) оператор.

...