Как выполнить функцию UpdateValues ​​после того, как функция asyn c LoadData завершит извлечение данных? - PullRequest
0 голосов
/ 05 мая 2020

Мудрые!

У меня есть функция LoadData(), которая успешно извлекает JSON данные из моей базы данных Firebase и обновляет мой PlayerData объект.

Однако, когда я пытаюсь чтобы выполнить функцию UpdateValues() в моем пользовательском интерфейсе после обновления PlayerData через прослушиватель событий, он либо обновит пользовательский интерфейс значениями null, либо Unity будет сканировать sh. И, что любопытно, когда он загружается со значениями null, он останавливает все Debug.Log вызовы консоли, продолжая выполнять функции, в которых они содержатся (т.е. данные будут загружаться и обновлять PlayerData, но вызовы отладки которые должны быть связаны с этими функциями, не доходят до консоли, и UI_Updater возвращает null значений).

Метод проб и ошибок заставил меня поверить, что у меня проблема с выполнением UpdateValues() на основной поток, в результате чего ведение журнала отладки останавливается, а Unity - cra sh.

Как я могу убедиться, что я выполняю UpdateValues() после завершения async LoadData()?

Для справки, вот async LoadData():

public async Task<PlayerData?> PleaseLoadPlayer()
    {
        DataSnapshot dataSnapshot = await _database.GetReference(PLAYER_KEY).GetValueAsync();
        if (!dataSnapshot.Exists)
        {
            Debug.Log("PleaseLoadPlayer() returned null.");
            return null;
        }
        else
        {
            PlayerData loadedPlayerData = JsonUtility.FromJson<PlayerData>(dataSnapshot.GetRawJsonValue());

            _playerData.Name = loadedPlayerData.Name;
            _playerData.Energy = loadedPlayerData.Energy;
            _playerData.Water = loadedPlayerData.Water;
            _playerData.Materials = loadedPlayerData.Water;
            _playerData.LP = loadedPlayerData.Tribe_LP;

            OnPlayerUpdated.Invoke(_playerData);
            OnDataSaved.Invoke();

            Debug.Log(loadedPlayerData.Name + " has been loaded successfully.");
        }

        OnLoadComplete.Invoke();    //This is where I am trying to trigger UpdateValues()

        return JsonUtility.FromJson<PlayerData>(dataSnapshot.GetRawJsonValue());
    }

И UpdateValues():

    void Start()
    {
        _player = PlayerBehaviour.GetComponent<PlayerBehaviour>();
        _playerSaveManager.OnLoadComplete.AddListener(UpdateValues);
    }

    public void UpdateValues()
    {
        if (_player.Name == null)
        {
            NameDisplay.SetText("Anonymous");
            EnergyValueDisplay.SetText("0000");
            WaterValueDisplay.SetText("0000");
            MaterialValueDisplay.SetText("0000");
            Debug.Log("No data exists in PlayerBehaviour.");
        }
        else
        {
            NameDisplay.SetText(_player.Name);
            EnergyValueDisplay.SetText("" + Energy.ToString("0000"));
            WaterValueDisplay.SetText("" + Water.ToString("0000"));
            MaterialValueDisplay.SetText("" + Materials.ToString("0000"));
            Debug.Log("UI data updated from PlayerBehaviour.");
        }
    }

Любые советы были бы весьма признательны. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...