我是 firebase 的新手,我目前正在联合开发部落冲突克隆游戏项目。我需要将用户数据(例如建筑物放置详细信息、他们的 lvl 和其他个人资料详细信息)放入 Cloud Firestore。我可以将此详细信息存储到 cloud firestore。但是我在从中检索数据时遇到了麻烦。我不太了解 firestore,我查看了他们的文档和一些 youtube 视频以将数据保存到 firestore,但我无法检索。
DocumentReference docRef = db.Collection("cities").Document("SF");
docRef.GetSnapshotAsync().ContinueWithOnMainThread(task =>
{
DocumentSnapshot snapshot = task.Result;
if (snapshot.Exists) {
Debug.Log(String.Format("Document data for {0} document:", snapshot.Id));
Dictionary<string, object> city = snapshot.ToDictionary();
foreach (KeyValuePair<string, object> pair in city) {
Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value));
}
} else {
Debug.Log(String.Format("Document {0} does not exist!", snapshot.Id));
}
});
这不是我的代码,我是从他们的文档中得到的,我的代码与此类似。我可以调试数据。但是我不能在这个 lambda 表达式之外使用它。我需要将数据保存到变量并使用它,就像我需要获取建筑物放置详细信息(我是一个字符串列表)一样,并在用户玩游戏时使用它来放置建筑物。
答案 0 :(得分:0)
就像@DedSec x47 所说的那样,您似乎遇到了更多的同步问题,而不是 firestore 问题。 要意识到的关键是您正在创建一个函数,该函数在 Firestore 检索您的数据时被称为 。 lambda 中的代码不会被立即调用,而是在主线程上检索数据时调用。问题不在于您从 lamda 外部访问结果,而是当您访问任务时,还没有从 firestore 检索到的结果。
我会研究 C# 中的 async/await 模式,它允许您以开发人员感觉是单线程的方式编写异步代码。我在 Firebase 项目中经常使用这种模式。
使用 async/await 上面的代码可能会变成:
DocumentReference docRef = db.Collection("cities").Document("SF");
DocumentSnapshot snapshot = await docRef.GetSnapshotAsync();
if (snapshot.Exists)
{
Debug.Log(String.Format("Document data for {0} document:", snapshot.Id));
Dictionary<string, object> city = snapshot.ToDictionary();
foreach (KeyValuePair<string, object> pair in city)
Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value));
}
else
Debug.Log(String.Format("Document {0} does not exist!", snapshot.Id));
(尽管 outters 方法的签名必须更改为 async Task<myReturnType> myMethodName(myParams...)
,因此此代码在您的项目中无法按原样运行。