2017-05-19 19 views
0

タイムスタンプ機能を自分のアプリケーションで動作させようとしていますが、そうではありません。私はJSQMessagesViewControllerとチャットアプリを構築しています。ユーザーが送信するメッセージごとに、そのメッセージをデータベースに表示します。Firebaseデータベースに値を追加

これまでのところ、これは私が持っているコードです。ここで

//ADD A NEW MESSAGE 

let timeStamp = NSNumber(value: Int(NSDate().timeIntervalSince1970)) 

    private func addMessage(withId id: String, name: String, text: String, time: NSNumber) { 
     if let message = JSQMessage(senderId: id, displayName: name, text: text) { 
      messages.append(message) 
     } 
    } 

    override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { 

     let itemRef = rootRef.child("messages").child("\(self.convoId!)").childByAutoId() // 1 
     let messageItem = [ // 2 
      "senderId": senderId!, 
      "ReceiverId": senderDisplayName!, 
      "text": text!, 
      "timestamp": timeStamp, 
      ] as [String : Any] 

     itemRef.setValue(messageItem) // 3 

     JSQSystemSoundPlayer.jsq_playMessageSentSound() // 4 

     finishSendingMessage() // 5 
     isTyping = false 
    } 

private func observeMessages() { 
    // 1. 
    let messageQuery = rootRef.child("messages/\(self.convoId!)").queryLimited(toLast: 25) 

    // 2. We can use the observe method to listen for new 
    // messages being written to the Firebase DB 
    newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) -> Void in 

    // 3. 
    let messageData = snapshot.value as! Dictionary<String, String> 

    if let id = messageData["senderId"] as String!, let name = messageData["ReceiverId"] as String!, let text = messageData["text"] as String!, let time = messageData["timeStamp"] as Any!, text.characters.count > 0 { 

    // 4. 
    self.addMessage(withId: id, name: name, text: text, time: time as! NSNumber) 

    // 5 
    self.finishReceivingMessage() 
    } 

は私のデータベースのスクリーンショットです: enter image description here

+0

あなたにはどんなエラーがありますか?または問題? –

+0

@VladPulichevメッセージを送信するとアプリがクラッシュしました。メッセージはデータベースに送られますが、私のView Controllerには表示されず、 'let messageData = snapshot.value as! Dictionary ' – juelizabeth

+0

ようにしよう! [文字列:AnyObject]。それは助けてくれましたか? –

答えて

1
をするNSNumberに変換する必要が指示していません

このラインを変更:

let messageData = snapshot.value as! [String: AnyObject] 
0

送信タイムスタンプ

override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { 

      let itemRef = rootRef.child("messages").child("\(self.convoId!)").childByAutoId() // 1 
      let messageItem = [ // 2 
       "senderId": senderId!, 
       "ReceiverId": senderDisplayName!, 
       "text": text!, 
       "timestamp": NSDate().timeIntervalSince1970, 
       ] as [String : Any] 

      itemRef.setValue(messageItem) // 3 

      JSQSystemSoundPlayer.jsq_playMessageSentSound() // 4 

      finishSendingMessage() // 5 
      isTyping = false 
     } 
+0

私はまだアプリケーションのクラッシュを行うため、observeMessages()関数をそのまま残しますか? – juelizabeth

関連する問題