2016-08-19 6 views
2

FIRServerValue.timestamp()によって作成されたオブジェクトのダウンロードされたタイムスタンプは、オンラインバージョンとわずかに異なります。私のコード:私は時々それが持っているにもかかわらず、メッセージを別のメッセージの前に来てバグに遭遇Firebase:FIRServerValue.timestamp()によって作成されたダウンロードされたタイムスタンプは、オンラインバージョンとわずかに異なります

text: Optional("1") - timestamp: 1471596374007.0 -> 1471596374874 
text: Optional("2") - timestamp: 1471596375044.0 -> 1471596375324 
text: Optional("3") - timestamp: 1471596376157.0 -> 1471596376461 
text: Optional("4") - timestamp: 1471596461213.0 -> 1471596463220 
text: Optional("5") - timestamp: 1471596542659.0 -> 1471596543307 

let messagesRef = self.ref.child("messages").child(chatId) 
    messagesRef 
     .queryOrderedByChild("timestamp") 
     .queryLimitedToLast(500) 
     .observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in 

      guard let object = snapshot.value as? [String: AnyObject] else { return } 

      let messageId = snapshot.key 

      if let 
       senderId = object["senderId"] as? String, 
       senderName = object["senderName"] as? String, 
       senderEmail = object["senderEmail"] as? String, 
       timestamp = object["timestamp"] as? NSTimeInterval { 

       let date = timestamp.toDate() 
       let text = object["text"] as? String 

       print("text: \(text) - timestamp: \(timestamp)") 
      } 
    }) 

ここでは、(->でマーク)オンライン値に比べてサンプル出力ですその特定のメッセージの後に送信されました。私はそれがこの振る舞いと関係があると考えています。検索されたタイムスタンプが正確でない場合、時間的に互いに近くに送信されたメッセージは、異なる順序で並べ替えることができます。

+0

"オンラインバリュー"とはどういう意味ですか? – cartant

+0

リアルタイムデータベースに保存された値。 – MJQZ1347

+0

「オンライン値」はFirebaseコンソールに表示される値ですか?新しいメッセージを作成するとき、または既存のメッセージを読むときに「オンライン値」とは異なる 'timestamps'を含む' ChildAdded'イベントが発生していますか? – cartant

答えて

3

documentationによると、サーバーに送信されたサーバーのタイムスタンプを指定するデータが含まれています:Unixエポックからのミリ秒数のため

プレースホルダ値を。

このプレースホルダは、サーバーのタイムスタンプに置き換えられます。ただし、データを追加するデバイスにChildAddedのリスナーがある場合、それらのリスナーはでローカルに通知されます()。これは、プレースホルダをローカルタイムスタンプに置き換えることになります。私はそれがリスナーを介して報告されたもの(メッセージが書き込まれたとき)とコンソールに表示されるものとの違いを見ているのではないかと思う。これは、読み込まれた値がコンソールに表示された値と一致する理由です。

Firebaseは、プッシュされたデータの鍵を生成するためのローカル・クロックとサーバ・クロック間のオフセットを考慮している可能性がありますが、データには若干の差が生じるため、サーバーにアクセスする時間。

このローカルイベントの発生は、予期しない順序でChildAddedイベントの発生を時々表示することもあります。数日前、私はanswered a question regarding unexpected snapshot orderingです。

+2

問題の解決策は、 '.ChildAdded'だけでなく' .ChildChanged'にも対応することです。フローの段階的な説明については、この質問への私の答えを参照してください:http://stackoverflow.com/questions/37864974/how-to-use-the-firebase-server-timestamp-to-generate-date-作成した –

関連する問題