所以我在我的Unity项目中尝试使用Firebase,我从未对异步相关的东西做过任何事情,我不理解如何解决这个问题。
public DatabaseData GetData()
{
DatabaseData data = new DatabaseData();
reference.GetValueAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
Debug.Log("error");
}
else if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
// Do something with snapshot...
Debug.Log("hit");
}
});
return data;
}
所以我尝试跟踪函数中发生的事情,发现它在点击Debug.Log("hit")
之前返回,导致返回一个空变量。
我试着四处搜索并看到人们使用协程,但这不会让我返回任何数据。
答案 0 :(得分:0)
尝试在之前声明引用 private DatabaseReference d;
d = ... GetReference(“您的推荐”); 简单的调用d.child(“yourchild”)。GetValueAsync()...
答案 1 :(得分:0)
是的,它返回空数据,因为任务尚未完成。你不是在等待它完成 - 这将首先打败使用异步的点。标准答案是如果可以的话,使用async / await,但不要触及continuation中的任何Unity内容,因为它将在池线程上运行。 编辑:实际上Unity定义了一个同步上下文,这意味着你不必担心在等待之后进入另一个线程:http://www.stevevermeulen.com/index.php/2017/09/using-async-await-in-unity3d-2017/
答案 2 :(得分:0)
我知道我参加晚会很晚,但万一其他人像我一样偶然发现了这个问题:
感谢@Jesper提供的链接,它非常有用,我鼓励所有人阅读它,但是,如果您正在寻找快速修复,这就是我将如何使用从中获得的信息重写上述示例的方法。 Jesper的链接。
public async Task GetData()
{
DatabaseData data = new DatabaseData();
await reference.GetValueAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
Debug.Log("error");
}
else if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
// Do something with snapshot...
Debug.Log("hit");
GLOBAL_VAR_DATA = data;
}
});
return;
}
这将导致程序暂停并等待getValueAsync完成其任务,然后再继续。而且,它现在从getValueAsync返回任务而不是数据。那将必须全局存储并在其他地方检索。您可以这样使用它:
await GetData();
data = GLOBAL_VAR_DATA;
等待GetData将完全解析,然后它将从全局变量中提取数据。如果成功,则GLOBAL_VAR_DATA具有所需的数据,并且可以在此时进行检索。