使用Cloud Firestore侦听器时,停止并重新启动播放器后,统一编辑器会卡在“ Application.Reload”上

问题描述

我在统一应用中使用Cloud Firestore,并且已按如下方式附加了一个侦听器:

public void ListenForFirestoreChange()
{
    DocumentReference docRef = db.Collection("users").Document(user.UserId);
    docRef.Listen(snapshot => {
            
        Dictionary<string,object> userEntry = snapshot.ToDictionary();
        Debug.Log("change detected: " + snapshot.Id + " " + (string)userEntry["firestoreTime"]);
    });
}

这很好用,但是当我停止播放器并重新启动播放器时,团结会因消息“ Application.Reload”而卡住。我试图在onApplicationQuit上停止侦听器,并将Firestore引用设置为null,但这没有用。我被迫结束Unity进程,如果我尝试正常退出,它将卡在Application.Quit上。我缩小了该应用程序的阻塞范围,并对此感到困惑。

我正在使用: Unity 2020.1.10f1

Visual Studio 16.7.6

Unity 6.16.1的Firebase

解决方法

经过大量尝试,我终于能够解决此问题。 要解决此问题:

在onApplicationQuit函数中,调用

FirebaseApp.DefaultInstance.Dispose();
,

使用“FirebaseApp.DefaultInstance.Dispose();”是一个错误因为您删除了所有与 Firebase 相关的实例,因此您必须再次重新初始化所有内容。

如果您不想关闭应用程序而只想退出应用程序,您应该这样做

根据docu,您必须使用函数“listener.Stop();”。

因此在这种情况下,您必须按以下方式使用它:

public void ListenForFirestoreChange(){

    DocumentReference docRef = db.Collection("users").Document(user.UserId);

    ListenerRegistration listener = docRef.Listen(snapshot => {
        
    Dictionary<string,object> userEntry = snapshot.ToDictionary();
    Debug.Log("change detected: " + snapshot.Id + " " + (string)userEntry["firestoreTime"]);

});}

当你想删除监听时,你必须执行以下函数:

listener.Stop();