如何在 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 中抑制“Windows 不支持 Firebase iOS 构建”错误?