繁体   English   中英

如何在 Unity 中使用异步 Firebase

[英]How to use async in Unity with Firebase

所以我试图在我的 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;
}

因此,我尝试跟踪 function 中发生的事情,并注意到它在命中Debug.Log("hit")之前返回,这导致返回了一个空变量。
我尝试四处搜索并看到人们使用协同程序,但这不会让我返回任何数据。

尝试声明之前的引用,例如 private DatabaseReference d;

d = ...GetReference("你的推荐人"); 简单调用 d.child("yourchild").GetValueAsync()...

是的,它返回空数据,因为任务尚未完成。 您不是在等待它完成 - 这首先会破坏使用 async 的意义。 如果可以,标准答案是使用 async/await,但不要在 continuation 中触及任何 Unity 内容,因为它将在池线程上运行。 编辑:实际上 Unity 定义了一个同步上下文,这意味着您不必担心在等待之后处于另一个线程中: http : //www.stevevermeulen.com/index.php/2017/09/using-async-await-in- unity3d-2017/

我知道我参加聚会迟到了,但以防万一其他人像我一样偶然发现:

感谢@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;

Await GetData 将完全解析,然后它将从全局变量中拉取数据。 如果成功了,GLOBAL_VAR_DATA就有你想要的数据了,这时候就可以检索了。

https://blog.xuite.net/akira32/home/590700144

当我使用下拉 RefreshShownValue 时,Unity firebase async 和 await

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM