Unity падает при асинхронном программировании с базой данных Firebase - PullRequest
0 голосов
/ 17 июня 2019

Когда я пытаюсь сделать это, происходит сбой:

Я хочу получить асинхронную передачу данных пользователя, если я не использую асинхронную задачу, она возвращает ноль

public class Database : MonoBehaviour
{
    private DatabaseReference m_database;

    private const string DATA_URL = "hidden";

    public static Database singleton;

    void Awake ()
    {
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl(DATA_URL);
        m_database = FirebaseDatabase.DefaultInstance.RootReference;

        DontDestroyOnLoad(this);
        singleton = this;
    }

    void Start ()
    {
        User user = new User();
        user = GetUserAsync("213asdasd").Result;
        Debug.Log(user.email);
    }

    public void RegisterNewUser (User user)
    {
        string jsonData = JsonUtility.ToJson(user);

        m_database.Child("Users").Child(user.id).SetRawJsonValueAsync(jsonData);
        m_database.Child("Users").Child(user.id).Child("id").SetValueAsync(user.id);

        m_database.Child("Users").Child(user.id).Child("email").SetValueAsync(user.email);
    }

    public async Task<User> GetUserAsync (string id)
    {
        User user = new User();
        await FirebaseDatabase.DefaultInstance.GetReference("Users").Child(id)
       .GetValueAsync().ContinueWith(task =>
       {
           if (task.IsFaulted)
           {
               // Handle the error...
           }
           else if (task.IsCompleted)
           {
               DataSnapshot snapshot = task.Result;
               string rawUserData = snapshot.GetRawJsonValue();
               Debug.Log(rawUserData);
               user = JsonUtility.FromJson<User>(rawUserData);
           }
       });

        return user;
    }
}

1 Ответ

1 голос
/ 17 июня 2019

Смешивание асинхронного ожидания и блокировки вызовов может вызвать проблемы.

Ссылка Асинхронное / ожидание - Лучшие практики асинхронного программирования

Используйте обработчик асинхронных событий, если код не может быть подвергнут рефакторингу для полной асинхронности

void Start () {
    started += onStarted;
    started(this, EventArgs.Empty);
}

event EventHandler started = delegate { }
private async void onStarted(object sender, EventArgs  args) {
    started -= onStarted;
    User user = await GetUserAsync("213asdasd");
    Debug.Log(user.email);
}

Также код должен следовать асинхронному шаблону

public async Task<User> GetUserAsync (string id) {
    User user = new User();
    try {
        DataSnapshot snapshot = await FirebaseDatabase.DefaultInstance
            .GetReference("Users").Child(id).GetValueAsync();
        string rawUserData = snapshot.GetRawJsonValue();
        Debug.Log(rawUserData);
        user = JsonUtility.FromJson<User>(rawUserData);
    } catch(Exception ex) {
        // Handle the error...
    }
    return user;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...