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

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

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

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

Swift

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

Q&A

1回答

2644閲覧

【Swift】FirebaseUIのsd_setImageを使うとAddリスナーの場合画像が表示されない

nakamu

総合スコア82

Firebase

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

Swift

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

0グッド

0クリップ

投稿2019/05/27 05:14

編集2022/01/12 10:55

sd_setImageを使うとチャットで追加された新しい画像を読み込めない問題を引き起こします。
数10キロバイトの画像でも試して同じ状態になったので、サイズの問題ではなさそうです。

ちなみにコメントアウトしている箇所はsd_setImageを使わずにダウンロードしている処理になります。

swift

1db.collection("privateChat").document(chatId).collection("messages").whereField("createTime", isGreaterThan: startTimestamp).addSnapshotListener{ querySnapshot, error in 2 guard let documents = querySnapshot?.documents else { 3 print("Error fetching documents: (error!)") 4 return 5 } 6 7 guard documents.count > 0 else { return } 8 9 guard let snapshot = querySnapshot else { 10 print("Error fetching documents: (error!)") 11 return 12 } 13 14 snapshot.documentChanges.forEach { diff in 15 switch diff.type { 16 case .added: 17 18 let messageData = diff.document.data() 19 20 // 名前 21 var name = "" 22 if messageData["senderId"] as! String == RootTabBarController.userId { 23 name = RootTabBarController.userInfo["name"] as! String 24 } else { 25 name = self.partnerData["name"] ?? "" 26 } 27 28 // 日付 29 var date = Date(timeIntervalSince1970: messageData["createTime"] as! TimeInterval) 30 let dateStr = date.toStringWithCurrentLocale() 31 date = DateFormatter.current("yyyy年MM月dd日 HH:mm").date(from: dateStr)! 32 33 // メッセージ 34 // テキスト 35 if messageData["type"] as! String == "text" { 36 let message = JSQMessage(senderId: messageData["senderId"] as? String, senderDisplayName: name, date: date, text: messageData["message"] as? String) 37 self.messages?.append(message!) 38 } else { 39 // 画像 40 let mediaItem = PhotoMediaItem(image: nil) 41 let imgRef = self.storageRef.child("privateChat").child(self.chatId).child(messageData["message"] as! String) 42 let imgView = UIImageView() 43 imgView.sd_setImage(with: imgRef) 44 mediaItem?.image = imgView.image 45 46// mediaItem?.appliesMediaViewMaskAsOutgoing = self.returnOutgoingStatusForUser(senderId: messageData["senderId"] as? String ?? "") 47// let imgRef = self.storageRef.child("privateChat").child(self.chatId).child(messageData["message"] as! String) 48// imgRef.downloadURL { url, error in 49// if let error = error { 50// // Handle any errors 51// print(error.localizedDescription) 52// } else { 53// self.downLoadImage(at: url!) { (image) in 54// if image != nil { 55// mediaItem?.image = image 56// self.collectionView.reloadData() 57// } 58// } 59// } 60// } 61 62 let message = JSQMessage(senderId: messageData["senderId"] as? String, senderDisplayName: name, date: date, media: mediaItem) 63 self.messages?.append(message!) 64 } 65 66 //メッセージの送信処理を完了する(画面上にメッセージが表示される) 67 self.finishReceivingMessage(animated: true) 68 69 70 default: 71 break 72 } 73 } 74 75 }

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

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

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

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

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

xenbeat

2019/05/27 07:20

参照「imgRef」は取得できているのですか? あと、ストレージに画像がどのように格納されているのかわかるように質問を編集しましょう。
nakamu

2019/05/27 08:21

参照できてます。コメントアウトしているdownloadURLを使った場合は取得できていますし、sd_setImageでも1度出て同じチャット画面に戻ってくると表示できています。
guest

回答1

0

sd_setImageは非同期で画像の取得を行うメソッドですから、メソッドの呼び出し直後に画像にアクセスすることはできません。画像の取得完了を待って後続の処理を行うように変更してみてください。

swift

1imgView.sd_setImage(with: imgRef) { (image, error, cacheType, storageRef) in 2 if let error = error { 3 print("Error loading image: (error)") 4 } else { 5 // 画像取得成功時の処理 6 mediaItem?.image = image 7 let message = JSQMessage(senderId: messageData["senderId"] as? String, senderDisplayName: name, date: date, media: mediaItem) 8 self.messages?.append(message!) 9 } 10} 11

投稿2019/06/17 13:11

kakajika

総合スコア3131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問