Итерация по DataSnapShot.Children останавливает выполнение кода (Unity, Firebase) - PullRequest
0 голосов
/ 19 марта 2019

Я пишу метод, который извлекает данные из Firebase в Unity (C #). Я могу успешно получить данные. Но когда я перебираю dataSnapShot.Children, чтобы присвоить значения моим определенным переменным, которые будут использоваться в игре. Казнь останавливается. В консоли нет ошибок.

public void GetUsers(List<User> users)
{
        FirebaseDatabase.DefaultInstance
  .GetReference("users")
        .GetValueAsync().ContinueWith(task =>
         {
                 if (task.IsFaulted) {
      // Handle the error...
                    Debug.Log("Error was:"+task.Exception.Message);
                    Debug.LogError("Error was:"+task.Result.Children);
            }
            else if (task.IsCompleted) {
            DataSnapshot snapshot = task.Result;
            // Do something with snapshot...
                        foreach(DataSnapshot s in snapshot.Children){
                        IDictionary dictUsers = (IDictionary)s.Value;   
                        Debug.Log(dictUsers["displayName"]);                    
                    }   
                    // After this foreach loop in snapshot.Children, nothing executes
                    UIManager.instance.ShowOtherUsers();
            }
  });
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я думаю, что это сочетание того и другого, например, когда вы инициализируете SDK, как это делается в потоке, который не является основным, если ваше соединение с Интернетом недостаточно хорошее, чтобы поддерживать темп процессора, основной поток и рабочий поток входит в условия гонки, которые не могут быть отслежены по принципу единства поведения (не подходит для многопоточности).

Ременбер, а также топик о форматах json, которые позволяют это делать, поддерживается только несколько собственных типов.

0 голосов
/ 19 марта 2019

Я как-то сделал обходной путь, чтобы исправить это. На самом деле SnapShot.Children (от Firebase Unity SDK) имеет IEnumerable. Тип. Я искал в интернете итерацию IEnumerable коллекций. А потом заменил мой код из этого:

else if (task.IsCompleted) {
        DataSnapshot snapshot = task.Result;
        // Do something with snapshot...
                    foreach(DataSnapshot s in snapshot.Children){
                    IDictionary dictUsers = (IDictionary)s.Value;   
                    Debug.Log(dictUsers["displayName"]);                    
                }   
                // After this foreach loop in snapshot.Children, nothing executes
                UIManager.instance.ShowOtherUsers();
        }

К этому:

else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
                // Do something with snapshot...

            using (var sequenceEnum = snapshot.Children.GetEnumerator())
            {
             for(int i = 0 ;i<snapshot.Children.Count();i++){
                while (sequenceEnum.MoveNext())
                {
                  try{
                      IDictionary dictUser =(IDictionary)sequenceEnum.Current.Value;

                      Debug.Log("displayName:"+dictUser["displayName"]);

                    }
                    catch(System.Exception e){
                        Debug.Log(e.Message);
                    }
                    Debug.Log("At The End!");
                UIManager.instance.ShowOtherUsers(); // Now it executes like a Charm 


         }

Это работало как Очарование ... Что я понимаю, так это то, что это выполнение выполнялось с помощью «Задачи» с резьбой. Хотя я не знаю точно, как это работает или почему это не работает с моим предыдущим кодом. Кто-то, кто может предоставить лучшую информацию, приветствуется :) Ура! * * 1013

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