2017-03-15 8 views
1

私は、アプリのクラッシュの原因となる小さなバグがあることに慣れています。 Firebaseからデータを照会すると、バグが起きる可能性が高いです(ええ、私のせいです)。これは、アプリの起動時に実行される最初の関数である。これが設定された後アプリがクラッシュしたときFirebaseがonDisconnectをサポートしないのはなぜですか?

let currentUser = FIRAuth.auth()?.currentUser?.uid 
      let con = self.gameRef!.childByAutoId() 
      self.usersKey = con.key 
      let values = ["username": "test", "score": 0, "userID": currentUser!] as [String : Any] 
      con.updateChildValues(values) 
      con.onDisconnectRemoveValue() 

その後、私は、例えばFirebaseから配列をクエリが、私は、アプリのクラッシュにつながるどのようないくつかの値が間違って設定しました。 onDisconnected関数は決して実行されません。一日中待っていて、私の情報はまだリアルタイムデータベースに表示されています。このコードがサーバー側で実行されている場合、どのようにサーバーがまだ私が接続していると思うかもしれませんか?アプリを閉じて&飛行機モードをオンにすると正しく切断されます。

+0

ここで、忍耐は美徳です。アプリケーションがクラッシュすると、Firebaseクライアントは明示的に切断を知らせる時間がありません。 'onDisconnect()'ハンドラはまだ起動しますが、数分(ソケットがタイムアウトするまでの時間)かかります。 http://stackoverflow.com/questions/30668292/firebase-when-ondisconnect-event-fire/30670928#30670928 –

+0

忍耐力はどれくらいありますか?私はすでに私の質問で、私は一日を待っていたと言いました、それは24時間だったと私を信じてください、それはまだ消えませんでした。 –

+0

私がリンクした答えで言ったように、それは数分かかることがあります。それより長い間は、他の何かが間違っていた可能性が高くなります。また、あなたの例では、アプリケーションを再起動すると同じ値が書き換えられることに注意してください。 –

答えて

0

これは、アプリが正常にシャットダウンしていないために発生します。その機能を起動するには、アプリがシャットダウンしてすべての接続をクリーンアップする必要があります。既にそれ以上のコードを実行しないため、クラッシュしたときにこれを行う方法はありません。

あなたは、コードのその部分を中心に例外ハンドラをラップして、あなたがその例外に必要なものを実行する可能性があります。

+1

※実際にはあります。しかし、それはサーバに依存します*切断を検出するには時間がかかります。私がリンクした答えを見てください。 –

+0

@FrankvanPuffelenありがとう、私はそれが何かを知らなかった。 –

+0

この関数はサーバー上で中継されるため、サーバーは接続を確認する必要があります。私は飛行機モードをオンにすると、切断を正しく処理します。アプリがクラッシュしたときではありません。 –

関連する問題