首页 > 解决方案 > 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 方法的替代方法吗?(与等待和协程解决方案相反)

标签: c#firebaseunity3dgoogle-cloud-firestore

解决方案


那篇文章的作者在这里

我不太清楚你是否做错了什么,但我的猜测是,也许你正在做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);

        });
    });
}

此外,请密切注意任何错误日志,将第一个更改ContinueWithContinueWithOnMainThread 可能会显示更多错误(某些版本的 Unity 确实无法在后台任务中报告错误)。

最后,值得检查一下您是否确实在当前游戏中设置了 Firestore。假设您的目录中有一个google-services.jsonGoogleService-Info.plistAssets/您可以转到“Window>Firebase>Documentation”: 菜单打开至

然后单击“在控制台中打开”以直接跳转到您的项目并仔细检查 Firestore 是否已设置:

如果您确实发现更改第一个ContinueWithContinueWithOnMainThread完全解决您的问题,那么可能值得提交一个错误。一般来说,Firebase 库应该是线程安全的,并且由于 Firestore 处于测试阶段,因此它可能是一个被遗漏的用例。


推荐阅读