c# - Unity firestore - 如何在 CheckAndFixDependenciesAsync() 之后立即运行 GetSnapshotAsync()?
问题描述
使用 Unity,我尝试使用 CheckAndFixDependenciesAsync() 初始化我的 firestore,并使用 GetSnapshotAsync() 从 firestore 获取文档。从firebase 文章中,可以使用 ContinueWithOnMainThread 为任务添加延续,如下面的示例所示:
Debug.Log("Checking Dependencies");
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(fixTask =>
{
Assert.IsNull(fixTask.Exception);
Debug.Log("Authenticating");
var auth = FirebaseAuth.DefaultInstance;
auth.SignInAnonymouslyAsync().ContinueWithOnMainThread(authTask =>
{
Assert.IsNull(authTask.Exception);
Debug.Log("Signed in!");
var successes = PlayerPrefs.GetInt("Successes", 0);
PlayerPrefs.SetInt("Successes", ++successes);
Debug.Log($"Successes: {successes}");
auth.SignOut();
Debug.Log("Signed Out");
});
});
但是,我的项目并非如此,我想使用 GetSnapshotAsync() 来检索一些“级别”数据 - 块内的所有内容都没有运行。
private void Start()
{
Debug.Log("Database awake ");
//check if all dependency is in project
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
string lvCode = "oHFxRAIpIHfT8moiYSl9";
Debug.Log("Get level :" + lvCode);
DocumentReference levelref = db.Collection("level").Document(lvCode);
levelref.GetSnapshotAsync().ContinueWithOnMainThread(querySnapshotTask =>
{
//Debug.Log here is not ran
Debug.Log("Completed? " + querySnapshotTask.Result);
Debug.Log("Faulted? " + querySnapshotTask.IsFaulted);
});
});
}
有人可以解释为什么我的代码会发生这种情况,并可能提供一些使用 ContinueWith 方法的替代方法吗?(与等待和协程解决方案相反)
解决方案
那篇文章的作者在这里
我不太清楚你是否做错了什么,但我的猜测是,也许你正在做db = FirebaseFirestore.DefaultInstance
那个块之外的事情(如果你正在做一个惰性初始化,请忽略这个)。之前调用它CheckAndFixDependenciesAsync
可能会导致您的问题(CheckAndFixDependenciesAsync
验证DefaultInstance
可以调用它而不会出错)。
删除您的db
参考可能会解决它:
private void Start()
{
Debug.Log("Database awake ");
//check if all dependency is in project
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
string lvCode = "oHFxRAIpIHfT8moiYSl9";
Debug.Log("Get level :" + lvCode);
DocumentReference levelref = FirebaseFirestore.DefaultInstance.Collection("level").Document(lvCode);
levelref.GetSnapshotAsync().ContinueWithOnMainThread(querySnapshotTask =>
{
//Debug.Log here is not ran
Debug.Log("Completed? " + querySnapshotTask.Result);
Debug.Log("Faulted? " + querySnapshotTask.IsFaulted);
});
});
}
此外,请密切注意任何错误日志,将第一个更改ContinueWith
为ContinueWithOnMainThread
可能会显示更多错误(某些版本的 Unity 确实无法在后台任务中报告错误)。
最后,值得检查一下您是否确实在当前游戏中设置了 Firestore。假设您的目录中有一个google-services.json
或GoogleService-Info.plist
,Assets/
您可以转到“Window>Firebase>Documentation”:
然后单击“在控制台中打开”以直接跳转到您的项目并仔细检查 Firestore 是否已设置:
如果您确实发现更改第一个ContinueWith
以ContinueWithOnMainThread
完全解决您的问题,那么可能值得提交一个错误。一般来说,Firebase 库应该是线程安全的,并且由于 Firestore 处于测试阶段,因此它可能是一个被遗漏的用例。
推荐阅读
- sql-server - SSMS SQL Server 网格未显示所有文本
- azure - 带有自动缩放虚拟机的 Nginx 负载均衡器
- react-native - 我怎样才能让 SectionList 的部分标题坚持一个偏移量?
- javascript - 在 Qualtrics 中推进热点问题的选定区域
- r - 如何在不使用绘图的情况下使用 X 变量提取单个 Y 变量值
- java - Spring批处理:在监听器中获取ExecutionContext
- angularjs - 如何在 Angular10 中使用 JQueryUI?
- python - 如何创建一个没有 python 库的虚拟环境
- python - 熊猫将具有相同索引的一列值组合到列表中
- function - 如何在gdb中找到要反汇编的输入功能?