遍历DataSnapShot.Children停止执行代码(Unity,Firebase)

时间:2019-03-19 01:04:17

标签: c# unity3d firebase-realtime-database

我正在编写一种从Unity(C#)中的Firebase检索数据的方法。我可以成功检索数据。但是,当我遍历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 :(得分:0)

我以某种方式解决了该问题,将其修复。 实际上,SnapShot.Children(由Firebase Unity SDK提供)是IEnumerable。类型。 我通过互联网搜索了iterating 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 


         }

它像吊饰一样工作...据我了解,此执行是通过线程“任务”完成的。 虽然,我不确切知道它是如何工作的,或者为什么它不能与我以前的代码一起工作。欢迎可以提供更好信息的人:) 干杯!

答案 1 :(得分:0)

我认为这是两者的结合,例如,当您初始化SDK时,如果您的Internet连接不足以保持cpu的速度,那么如何在不是主线程的线程中完成它,主线程和工作线程进入的竞争状态无法通过统一单行为的方式进行跟踪(根本不友好多线程)。

请注意有关允许使用json格式的topyc,只有少数本机类型受支持。