使用Firebase数据库进行异步编程时Unity崩溃 [英] Unity crashes on async programming with Firebase database

查看:334
本文介绍了使用Firebase数据库进行异步编程时Unity崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试执行此操作时,它会崩溃:

When I try to do this it crashes:

我想使用户数据异步,如果我不使用异步任务,它将返回null

I want to get the user data async, if I don't use async task it returns null

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;
    }
}

推荐答案

混合async-await和阻止调用会导致问题.

Mixing async-await and blocking calls can cause problems.

参考异步/等待-异步编程的最佳做法

如果无法将代码完全重构为异步,请使用异步事件处理程序

Use an async event handler if the code is unable to be refactored to be async all the way

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);
}

代码也应始终遵循异步模式

Also code should follow async all the way pattern

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;
}

这篇关于使用Firebase数据库进行异步编程时Unity崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆