Я не знаком с FirebaseREST
(я бы порекомендовал использовать официальный плагин Firebase *1003*, если вы можете, это гораздо больше, чем просто вызов конечных точек REST), но я думаю, что вижу Ваша проблема.
GetValueAsync
, вероятно, работает в фоновом режиме асинхронно. Таким образом, логика c внутри блока (часть (res)=>
) запускается много раз (в основном бесконечно с этим, в то время как l oop). Затем, в зависимости от того, как это реализовано, либо continueSearch
никогда не переходит к false
, потому что он не помечен volatile , либо logi обратного вызова c никогда не получает шанс на запуск (скажем, если FirebaseREST
пытается отправить в основной поток, который заблокирован бесконечно, пока l oop).
Если GetValueAsync
возвращает задание, вы можете использовать некоторые из советов, которые я рассмотрел в this статья . Я бы порекомендовал попробовать использовать async / await, чтобы ваш лог c выглядел так:
async public int GetLastUsedID()
{
volatile int currentID = 1;
volatile bool continueSearch = true;
while (continueSearch)
{
FirebaseREST.DatabaseReference reference = FirebaseREST.FirebaseDatabase.Instance.GetReference(""+currentID);
string value = "";
currentID++;
await reference.GetValueAsync(10, (res) =>
{
if (res.success)
{
value = res.data.GetRawJsonValue();
Debug.Log("Success fetched data : " + value);
if(value == "")
{
continueSearch = false;
Debug.Log(currentID);
}
}
else
{
Debug.Log("Fetch data failed : " + res.message);
continueSearch = false;
}
});
}
return currentID;
}
Это, вероятно, не тот случай, в этом случае вы, вероятно, захотите включить это в рекурсивный вызов. Вы бы хотели какую-то функцию, такую как:
public void GetLastUsedID(currentId)
{
FirebaseREST.DatabaseReference reference = FirebaseREST.FirebaseDatabase.Instance.GetReference(""+currentID);
reference.GetValueAsync(10, (res) =>
{
if (res.success)
{
value = res.data.GetRawJsonValue();
Debug.Log("Success fetched data : " + value);
if(value == "")
{
continueSearch = false;
Debug.Log(currentID);
}
else
{
// recurse
GetLastID(currentId+1);
}
}
else
{
Debug.Log("Fetch data failed : " + res.message);
continueSearch = false;
}
});
}
Вы должны будете выяснить, как передать свой собственный обратный вызов, чтобы описать такой успех или неудачу (упражнение для читателя).
Наконец, я буду немного осторожен с тем, что вы делаете полностью. Если вы аутентифицируете пользователей, я бы рекомендовал использовать Firebase Authentication , которая напрямую связана с базой данных реального времени. Самое большее, вы можете хранить там только идентификаторы пользователей и использовать правила безопасности , чтобы гарантировать, что только этот пользователь может писать в него (например). Используя Firebase Authentication для управления пользовательскими данными и привязывая их к правилам RTDB, вы избежите тех же ошибок , которые автор сделал .