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

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

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

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

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Q&A

解決済

1回答

3412閲覧

【Swift】Firebaseから複数データ取得

ishiishiyay

総合スコア33

Firebase

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

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

0グッド

1クリップ

投稿2018/03/07 16:08

編集2018/03/08 15:36

Swift初心者のヒロポメです。
Firebase関連でつまづいてしまったので、お助けください・・・

【やりたいこと】
Firebaseから複数の音声データを取得して、collection viewに表示させたいです。

【つまづき箇所】
FirebaseのStorageにはすでに複数音声をアップ済です。
それらを取得してcollection viewに1個1個表示させたいものの、
ビルドはできても、最新の音声しか流れません。collection viewのうち、どのcellを押しても、
同じ最新の1つの音声しか流れません。
以下コードのsnapshotをprintしてみると、確かに1メッセージ分の情報しか出力されません。

FirebaseのDatabase上の構造は以下の通りです。
Media_Messagesの下に、childByAutoId、その下にsender_id, sender_name, toID, urlなどがぶら下がっています。

![イメージ説明

どこをいじればやりたいことが実現できますでしょうか。
アドバイス頂けますととても助かります、、、
よろしくお願いいたします。

Swift

1 2 var audioPlayer: AVAudioPlayer! 3 4Database.database().reference.child("Media_Messages").observe(.childAdded, with:{ 5 (snapshot) in 6 7 print(snapshot) 8 /*出力結果: 9Snap (-L6tdyvGHT1hXnz34teV) { 10 "sender_id" = mZJKe7aV8gWMNZS0GHfwfh649Sh2; 11 "sender_name" = yeah; 12 toID = 555; 13 url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FmZJKe7aV8gWMNZS0GHfwfh649Sh29F395AA3-A3EF-4612-AF25-9963E06B059D.m4a?alt=media&token=56ecd74b-0fee-4c17-b2a3-c290b73bdedc"; 14 } */ 15 16 if let dictionary2 = snapshot.value as? [String:AnyObject]{ 17 if let audioUrl = dictionary2["url"] as? String { 18 print(audioUrl) 19 //https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FmZJKe7aV8gWMNZS0GHfwfh649Sh29F395AA3-A3EF-4612-AF25-9963E06B059D.m4a?alt=media&token=56ecd74b-0fee-4c17-b2a3-c290b73bdedc 20 let url2 = URL(string: audioUrl) 21 print(url2) 22 //Optional(https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FmZJKe7aV8gWMNZS0GHfwfh649Sh29F395AA3-A3EF-4612-AF25-9963E06B059D.m4a?alt=media&token=56ecd74b-0fee-4c17-b2a3-c290b73bdedc) 23 24 URLSession.shared.dataTask(with: url2!, completionHandler: { (data, response, error) in 25 26 DispatchQueue.global().async{ 27 DispatchQueue.main.async{ 28 29 do { self.audioPlayer = try AVAudioPlayer(data:data!) 30 31 } 32 catch{} 33 34 } 35 } 36 37 }).resume() 38 } 39 } 40 } , withCancel:nil) 41 42 43//collectionviewで再生 44 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 45 do{ 46 audioPlayer.play() 47 } catch { 48 49 } 50 51 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1Database.database().reference.child("Media_Messages").observe(.childAdded) 23 4Database.database().reference.child("Media_Messages").observe(.value, with: { (snapshot) in 5 6 for item in (snapshot.children) { 7 8 // 中身の取り出し 9 let snapshot = item as! DataSnapshot 10 let dict = snapshot.value as! [String: Any] 11 print(dict) 12 13 } 14}) 15

で複数データが取れませんでしょうか?

投稿2018/03/07 22:20

編集2018/03/10 07:00
newmt

総合スコア1277

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

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

ishiishiyay

2018/03/08 03:54

newmtさん ご回答いただきありがとうございます!! 頂いたコードでやってみますと、print(snapshot)で複数データが無事出力されるものの、 if let dictionary2 = item as? [String:AnyObject]{ 以降に進めなくなってしまいます。 したがって、ビルド実行はできますが、audioPlayerに値が入っていないため、 audioPlayer.play()の行で、「Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value」となってしまいます。 ちなみに僕のコードを維持したまま、最初の.childAddedのところだけを.valueに変えると、 print(snapshot)で同じく複数データ出力でき、 上記の if let dictionary2 = item as? [String:AnyObject]{ はクリアできますが、 次の行の if let audioUrl = dictionary2["url"] as? String { 以降に進めなくなります。 大変お手数ですが、引き続きアドバイス頂けますと嬉しいです。。。! よろしくお願いいたします。
newmt

2018/03/08 08:04

おそらくdictionary2["url"] as? Stringが取得できていないのだと思いますが、dictionary2の中身を教えて頂いてもよろしいでしょうか?
ishiishiyay

2018/03/08 14:54

newmtさん、 頂いたコード: for item in (snapshot.children) { if let dictionary2 = item as? [String:AnyObject]{          〜 元々のコード: if let dictionary2 = snapshot.value as? [String:AnyObject]{      〜 上記コードのように、 dictionary2の中身は、snapshotで取り出した複数データが入った辞書をアンラップしたものです。 すなわち、最初の質問で載せた画像の、sender_name, sender_id, toID, timeStamp, url(document directoryに録音・保存した音声のurlのString値)が入るようにしています。 dictionary2["url"]で、辞書のうち、urlの値にアクセスしようとしています。 意味不明なこと言っていたらすみません! よろしくお願いいたします!
newmt

2018/03/08 21:23

print出力はできませんでしょうか?もしかしたらキー名や型が違うのかなと思いまして。
ishiishiyay

2018/03/10 04:02 編集

newmtさん、 遅れてすみません! dictionary2はprint出力できます!以下が出力内容です。 ["-L79weVuQeWnVG-s-j5T": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602093.2799"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1812B0F7E-F1E7-467C-A4A9-CEAB348A32FB.m4a?alt=media&token=a32a571c-6998-4027-bbea-b90adc9d8196"; }, "-L79wcCRrPsnytXMjT3N": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602083.812748"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1086C5279-1A24-415D-B148-6321A9ABE4EB.m4a?alt=media&token=ce106a93-2f57-4065-90ff-7e913dee457d"; }, "-L7D0zokANaUb-oUNnTd": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520653821.025217"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1E6868905-1716-456C-BA22-6D174B262F64.m4a?alt=media&token=7075e820-042b-4a8b-99ee-a539505fab8d"; }] ただ、以下コードのprint("YYY")が出力されません。 冒頭の .valueを元の.childAddedにすると、全て出力され、音声も流れますが、 1つの音声しか取得できていません。。。 Database.database().reference.child("Media_Messages").observe(.value, with: { (snapshot) in if let dictionary2 = snapshot.value as? [String:AnyObject]{ print(dictionary2) if let audioUrl = dictionary2["url"] as? String { print("YYY") let url2 = URL(string: audioUrl) URLSession.shared.dataTask(with: url2!, completionHandler: { (data, response, error) in DispatchQueue.global().async{ DispatchQueue.main.async{ do { self.audioPlayer = try AVAudioPlayer(data:data!) } catch{} } } }).resume() } } }, withCancel: nil) 度々恐れ入りますが、よろしくお願いいたします!!
newmt

2018/03/10 06:43 編集

{(snapshot) in print(snapshot) だと何が出てきますでしょうか? また、print(dictionary2)の下で for d in dictionary2.values { print(d) print(d["url"]) } と追記すると何か出てきますでしょうか?
ishiishiyay

2018/03/10 09:08

以下コードで、 (snapshot) in print("SPRING") print(snapshot) if let dictionary2 = snapshot.value as? [String:AnyObject]{ print(dictionary2) for d in dictionary2.values { print("SPRING2") print(d) print("SPRING3") print(d["url"]) } 以下出力結果です!!よろしくお願いいたします・・・ SPRING Snap (Media_Messages) { "-L79wQp5asVRjGPqMMJm" = { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602033.241108"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q11CB84EBA-9B25-4E97-923E-238331EE4A2E.m4a?alt=media&token=c6f9b8a5-3c96-47cc-8a7f-bbf46c6a2561"; }; "-L79wcCRrPsnytXMjT3N" = { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602083.812748"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1086C5279-1A24-415D-B148-6321A9ABE4EB.m4a?alt=media&token=ce106a93-2f57-4065-90ff-7e913dee457d"; }; "-L79weVuQeWnVG-s-j5T" = { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602093.2799"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1812B0F7E-F1E7-467C-A4A9-CEAB348A32FB.m4a?alt=media&token=a32a571c-6998-4027-bbea-b90adc9d8196"; }; "-L7D0zokANaUb-oUNnTd" = { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520653821.025217"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1E6868905-1716-456C-BA22-6D174B262F64.m4a?alt=media&token=7075e820-042b-4a8b-99ee-a539505fab8d"; }; } ["-L79weVuQeWnVG-s-j5T": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602093.2799"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1812B0F7E-F1E7-467C-A4A9-CEAB348A32FB.m4a?alt=media&token=a32a571c-6998-4027-bbea-b90adc9d8196"; }, "-L79wQp5asVRjGPqMMJm": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602033.241108"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q11CB84EBA-9B25-4E97-923E-238331EE4A2E.m4a?alt=media&token=c6f9b8a5-3c96-47cc-8a7f-bbf46c6a2561"; }, "-L79wcCRrPsnytXMjT3N": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602083.812748"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1086C5279-1A24-415D-B148-6321A9ABE4EB.m4a?alt=media&token=ce106a93-2f57-4065-90ff-7e913dee457d"; }, "-L7D0zokANaUb-oUNnTd": { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520653821.025217"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1E6868905-1716-456C-BA22-6D174B262F64.m4a?alt=media&token=7075e820-042b-4a8b-99ee-a539505fab8d"; }] SPRING2 { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602093.2799"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1812B0F7E-F1E7-467C-A4A9-CEAB348A32FB.m4a?alt=media&token=a32a571c-6998-4027-bbea-b90adc9d8196"; } SPRING3 Optional(https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1812B0F7E-F1E7-467C-A4A9-CEAB348A32FB.m4a?alt=media&token=a32a571c-6998-4027-bbea-b90adc9d8196) SPRING2 { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602033.241108"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q11CB84EBA-9B25-4E97-923E-238331EE4A2E.m4a?alt=media&token=c6f9b8a5-3c96-47cc-8a7f-bbf46c6a2561"; } SPRING3 Optional(https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q11CB84EBA-9B25-4E97-923E-238331EE4A2E.m4a?alt=media&token=c6f9b8a5-3c96-47cc-8a7f-bbf46c6a2561) SPRING2 { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520602083.812748"; toID = peCb6XsG5XfPa4qzgQPb2VQh85q1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1086C5279-1A24-415D-B148-6321A9ABE4EB.m4a?alt=media&token=ce106a93-2f57-4065-90ff-7e913dee457d"; } SPRING3 Optional(https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1086C5279-1A24-415D-B148-6321A9ABE4EB.m4a?alt=media&token=ce106a93-2f57-4065-90ff-7e913dee457d) SPRING2 { "sender_id" = peCb6XsG5XfPa4qzgQPb2VQh85q1; "sender_name" = 555; timeStamp = "1520653821.025217"; toID = kVC8wXHkIjhjYjMPFAuSmUuK0Kr1; url = "https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1E6868905-1716-456C-BA22-6D174B262F64.m4a?alt=media&token=7075e820-042b-4a8b-99ee-a539505fab8d"; } SPRING3 Optional(https://firebasestorage.googleapis.com/v0/b/guy-4cc29.appspot.com/o/Audio_Storage%2FpeCb6XsG5XfPa4qzgQPb2VQh85q1E6868905-1716-456C-BA22-6D174B262F64.m4a?alt=media&token=7075e820-042b-4a8b-99ee-a539505fab8d)
newmt

2018/03/10 11:00

SPRING3(=d["url"])のところで取得したいURLが取れていませんでしょうか? もしくは修正した回答の中のprint(dict)をprint(dict["url"])しても同様にURLが表示されませんでしょうか?
ishiishiyay

2018/03/11 09:42

newmtさん、 d["url"]を使って、urlを複数出力でき、音声取得できました! ありがとうございます! ただ、どのcellを押しても同じ音声しか再生されない点が 解決できなかったので、色々試してみようと思います。 長いこと教えていただき本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問