如何在 Unity 和 Firebase 中使用异步

Posted

技术标签:

【中文标题】如何在 Unity 和 Firebase 中使用异步【英文标题】:How to use async in Unity with Firebase 【发布时间】:2018-07-13 02:23:21 【问题描述】:

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

【问题讨论】:

【参考方案1】:

尝试在诸如之前声明引用 私有数据库参考 d;

d = ...GetReference("你的参考"); 简单调用 d.child("yourchild").GetValueAsync()...

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

我知道我迟到了,但万一其他人像我一样偶然发现:

感谢@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就有了你想要的数据,此时就可以取回了。

【讨论】:

以上是关于如何在 Unity 和 Firebase 中使用异步的主要内容,如果未能解决你的问题,请参考以下文章

Unity/Firebase 如何使用 Google 进行身份验证?

如何在 Unity 中使用 Gradle

如何在 Unity 中测试 Firebase 动态链接?

如何在 Unity 中抑制“Windows 不支持 Firebase iOS 构建”错误?

在 Xcode 中构建档案时出错(我使用过 Unity 和 Firebase)

Unity 中的 Google Firebase 身份验证:如何读取错误代码