如何在Unity中使用与Firebase的异步

时间:2018-02-02 14:47:23

标签: c# firebase unity3d asynchronous firebase-realtime-database

所以我在我的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")之前返回,导致返回一个空变量。
我试着四处搜索并看到人们使用协程,但这不会让我返回任何数据。

3 个答案:

答案 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具有所需的数据,并且可以在此时进行检索。