usando Unity, estoy tratando de inicializar mi tienda de fuego usando CheckAndFixDependenciesAsync() y obteniendo un documento de la tienda de fuego usando GetSnapshotAsync(). Desde un artículo de firebase , es posible agregar una continuación para la tarea con ContinueWithOnMainThread como se muestra en el ejemplo aquí:
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"); }); });Sin embargo, este no es el caso de mi proyecto, donde quiero usar GetSnapshotAsync() en su lugar para recuperar algunos datos de 'nivel': todo lo que está dentro del bloque no se está ejecutando.
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); }); }); }¿Alguien puede explicar por qué le sucede esto a mi código y posiblemente proporcionar algunas alternativas que usan los métodos ContinueWith? (a diferencia de las soluciones await y coroutine)
Autor de ese artículo aquí 😃
No puedo ver si está haciendo algo mal, pero supongo que tal vez esté haciendo un db = FirebaseFirestore.DefaultInstance fuera de ese bloque (ignore esto si está haciendo una inicialización diferida). Llamar a eso antes CheckAndFixDependenciesAsync podría estar causando su problema ( CheckAndFixDependenciesAsync verifica que DefaultInstance puede llamar a DefaultInstance sin que se produzca un error).
db su referencia de base de datos podría solucionarlo:
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); }); }); } Además, preste mucha atención a cualquier registro de errores, cambiar el primer ContinueWith a ContinueWithOnMainThread podría revelar más errores (algunas versiones de Unity no informan errores en las tareas en segundo plano).
Finalmente, vale la pena verificar que realmente tengas la configuración de Firestore con tu juego actual. Suponiendo que tiene google-services.json o GoogleService-Info.plist en su directorio Assets/ , puede ir a "Ventana>Firebase>Documentación": 
Y haga clic en "Abrir en la consola" para ir directamente a su proyecto y verifique que Firestore esté configurado: 
Si encuentra que cambiar el primer ContinueWith a ContinueWithOnMainThread soluciona su problema por completo, podría valer la pena informar un error . En general, las bibliotecas de Firebase deben ser seguras para subprocesos y, dado que Firestore está en versión beta, tal vez se haya perdido un caso de uso.