質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2574閲覧

swiftのリアルタイムチャット機能について質問があります

kazuv2

総合スコア10

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2016/11/25 06:02

編集2016/11/25 06:17

http://www.atmarkit.co.jp/ait/articles/1606/06/news020_3.html
上記のサイト様を参考にシステムを開発したのですが、実行した際にチャットの順番がぐちゃぐちゃになってしまいます。

原因を探ってみたのですが、全くわかりません、どうかご助力の方お願い致します。

swift

1import UIKit 2import JSQMessagesViewController 3import Firebase 4import FirebaseDatabase 5 6class ViewController: JSQMessagesViewController { 7 var messages: [JSQMessage] = [] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 senderDisplayName = "tst" 12 senderId = "tst" 13 let ref = FIRDatabase.database().reference() 14 ref.observe(.value, with: { snapshot in 15 guard let dic = snapshot.value as? Dictionary<String, AnyObject> 16 else{ 17 return 18 } 19 guard let posts = dic["messages"] as? Dictionary<String, 20 Dictionary<String,String>> else{ 21 return 22 } 23 self.messages = posts.values.map { dic in 24 let senderId = dic["senderId"] ?? "" 25 let text = dic["text"] ?? "" 26 let displayName = dic["displayName"] ?? "" 27 return JSQMessage(senderId: senderId, displayName: 28 displayName, text: text) 29 } 30 self.collectionView.reloadData() 31 }) 32 33 } 34 35 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! { 36 return messages[indexPath.row] 37 } 38 39 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! { 40 if messages[indexPath.row].senderId == senderId { 41 return JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage( 42 with: UIColor(red: 112/255, green: 192/255, blue: 75/255, alpha: 1)) 43 } else { 44 return JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage( 45 with: UIColor(red: 229/255, green: 229/255, blue: 229/255, alpha: 1)) 46 } 47 } 48 49 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 50 51 let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as? JSQMessagesCollectionViewCell 52 if messages[(indexPath as NSIndexPath).row].senderId == senderId { 53 cell?.textView?.textColor = UIColor.white 54 } else { 55 cell?.textView?.textColor = UIColor.darkGray 56 } 57 return cell! 58 } 59 60 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 61 return messages.count 62 } 63 64 override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! { 65 66 return JSQMessagesAvatarImageFactory.avatarImage( 67 withUserInitials: messages[indexPath.row].senderDisplayName, 68 backgroundColor: UIColor.lightGray, textColor: UIColor.white, 69 font: UIFont.systemFont(ofSize: 10), diameter: 30) 70 } 71 override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { 72 print("beforeA",text, senderId, senderDisplayName, date) 73 inputToolbar.contentView.textView.text = "" 74 print("A") 75 let ref = FIRDatabase.database().reference() 76 print("B") 77 ref.child("messages").childByAutoId().setValue( 78 ["senderId": senderId, "text": text, "displayName": senderDisplayName]as [AnyHashable:Any]) 79 //print文を挟み、どこまでコードが動いているかをコンソールの方へ出力。 80 //as [AnyHashable:Any]を最後に追加 2016/11/02 1:03 81 print("C") 82 } 83}

(追記)参考画像とデーダベースを貼っておきます

イメージ説明

イメージ説明

yuuki2622👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考サイトのコードを見ると
ref.observeEventType(.Value, withBlock: { snapshot in
でFirebaseデータベース全体のデータを受け取り、
その中からpostsという変数にDictionary型でメッセージ一覧を取り出し、
self.messages = posts.values.map { dic in
でDictionary内のvalueの一覧を取り出していますから、
メッセージが順不同でバラバラに表示されてしまうのは当然だと思います。

その参考サイトを参照するのはやめて
http://qiita.com/ryotakodaira/items/b234d1d51ae6b1110e8b
とか
https://www.raywenderlich.com/140836/firebase-tutorial-real-time-chat-2
を参考にした方がよいと思います。

こちらは、observe(.childAddedでFirebaseからデータを受け取っていますので
投稿した順にデータを受けとって並べられるはずです。

投稿2016/11/26 03:10

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問