Coroutine не запускается внутри OnResponseGot - PullRequest
0 голосов
/ 19 сентября 2019

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

    private void RetrieveFromDatabase(int index)
    {
        Debug.Log($"{index} started...");
        FirebaseDatabase.DefaultInstance.GetReference("/Teams/" + TeamsSelection.teamSelected + "/").Child(index.ToString()).Child("userPosition").GetValueAsync()
           .ContinueWith(task => 
           {
               if (task.IsFaulted)
               {
                   //handle error
               }
               else if(task.IsCompleted)
               {
                   DataSnapshot snapshot = task.Result;
                   OnResponseGot(snapshot, index);
                   return;
               }
           });
    }

    private void OnResponseGot(DataSnapshot dataSnapshot, int index)
    {
        if (dataSnapshot == null || int.Parse(dataSnapshot.Value.ToString()) < 10)
        {
            Debug.Log("Trying again to retrieve " + index);
            RetrieveFromDatabase(index);
        }
        else
        {
            int userPos = int.Parse(dataSnapshot.Value.ToString());
            Debug.Log("retrieved userPos " + userPos);
            StartCoroutine(FetchWithUWR(userPos, index));
            //FetchWithResourceLoad(userPos, index);
        }
    }

    IEnumerator FetchWithUWR(int userPos, int index)
    {
        Debug.Log("Starting uwr for audioFiles");
        using (UnityWebRequest uwr = UnityWebRequestMultimedia.GetAudioClip($"C:/Users/Domas/Desktop/Projects/Wild_West/Assets/Resources/Audio/WAV_ENG/D{userPos}a", AudioType.WAV))
        {
            yield return uwr.SendWebRequest();
            Debug.Log("yielded a file!");
            if (uwr.isNetworkError)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                AudioClip clip = DownloadHandlerAudioClip.GetContent(uwr);
                Debug.Log("Starting Coroutine " + index);
                StartCoroutine(PlayAudioClipAndStartRetrievingFromDatabase(index, clip));
            }
        }
    }

Я даже не знаю, с чего начать искать проблему, потому что я не получаю никаких ошибок.программа просто продолжается, но без сопрограммы.

1 Ответ

0 голосов
/ 19 сентября 2019

Эта проблема может появиться, если вы попытались запустить сопрограмму в другом потоке.В этом случае Firebase может обработать исключение и заставить его замолчать.Попробуйте использовать что-то вроде этого для ожидания запроса в основном потоке:

    private bool requestDone;
    private DataSnapshot dataSnapshot;
    private int index;

    private void RetrieveFromDatabase(int index)
    {
        Debug.Log($"{index} started...");
        requestDone = false;
        StartCoroutine(WaitForResponce());

        FirebaseDatabase.DefaultInstance.GetReference("/Teams/" + TeamsSelection.teamSelected + "/").Child(index.ToString()).Child("userPosition").GetValueAsync()
           .ContinueWith(task => 
           {
               if (task.IsFaulted)
               {
                   //handle error
               }
               else if(task.IsCompleted)
               {
                   DataSnapshot snapshot = task.Result;
                   this.index = index;
                   thos.dataSnapshot = snapshot;
               }
               requestDone = true;
           });
    }

    private IEnumerator WaitForResponce()
    {
        while (!requestDone) yield return null;

        if (dataSnapshot == null || int.Parse(dataSnapshot.Value.ToString()) < 10)
        {
            Debug.Log("Trying again to retrieve " + index);
            RetrieveFromDatabase(index);
        }
        else
        {
            int userPos = int.Parse(dataSnapshot.Value.ToString());
            Debug.Log("retrieved userPos " + userPos);
            StartCoroutine(FetchWithUWR(userPos, index));
            //FetchWithResourceLoad(userPos, index);
        }
    }
...