Вы видите классическую путаницу с асинхронными API.Поскольку загрузка данных из Firebase может занять некоторое время, это происходит асинхронно (в отдельном потоке).Это позволяет вашему основному коду продолжить работу, пока клиент Firebase ожидает ответа от сервера.Когда данные доступны, клиент Firebase вызывает ваш метод обратного вызова с этими данными, чтобы вы могли их обработать.
Проще всего увидеть, что это делает в вашем коде, поместив несколько операторов регистрации:
Debug.Log("Before starting to load data");
FirebaseDatabase.DefaultInstance
.GetReference("Leaders").OrderByChild("score").GetValueAsync().ContinueWith(task => {
Debug.Log("Got data");
}
});
Debug.Log("After starting to load data");
Когда вы запускаете этот код, он печатает:
Перед началом загрузки данных
После начала загрузки данных
Получил данные
Вероятно, это не тот порядок, в котором вы ожидали вывод.Из-за асинхронного характера вызова Firebase вторая строка журнала печатается последней.Это точно объясняет, почему вы видите пустой массив при его возврате: к тому времени данные еще не были загружены из Firebase, а ваш ContinueWith
еще не выполнен.
Решение дляэто всегда одно и то же: так как вы не можете вернуть данные, которые еще не загружены, вы должны реализовать функцию обратного вызова.Код, которым вы поделились, уже делает это дважды: один раз для ContinueWith
самой Firebase и один для RetriveLeaderBoard
.
Любой код, которому требуется актуальная таблица лидеров, по сути должен будет вызвать RetriveLeaderBoard
и делать любую работу с данными списка лидеров в обратном вызове.Например, если вы хотите распечатать таблицу лидеров:
DataBaseModel.Instance.RetriveLeaderBoard(result => {
Debug.Log(result);
});