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

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

ただいまの
回答率

90.48%

  • Swift

    8937questions

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

  • iOS

    4773questions

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

  • Firebase

    970questions

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

  • TableView

    146questions

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

  • SNS

    116questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,325

ishicoro

score 12

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などがぶら下がっています。

![イメージ説明

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

 var audioPlayer: AVAudioPlayer!

Database.database().reference.child("Media_Messages").observe(.childAdded, with:{
           (snapshot) in

            print(snapshot)
            /*出力結果:
Snap (-L6tdyvGHT1hXnz34teV) {
            "sender_id" = mZJKe7aV8gWMNZS0GHfwfh649Sh2;
            "sender_name" = yeah;
            toID = 555;
            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";
        } */

            if let dictionary2 = snapshot.value as? [String:AnyObject]{
                if let audioUrl = dictionary2["url"]  as? String {
                    print(audioUrl)
                    //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
                    let url2 = URL(string: audioUrl)
                    print(url2)
                    //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)

                    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)


//collectionviewで再生
 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        do{
            audioPlayer.play()
        } catch {

        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Database.database().reference.child("Media_Messages").observe(.childAdded)
↓

Database.database().reference.child("Media_Messages").observe(.value, with: { (snapshot) in

    for item in (snapshot.children) {

        // 中身の取り出し
        let snapshot = item as! DataSnapshot
        let dict = snapshot.value as! [String: Any]
        print(dict)

    }
}) 


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/08 12: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 {
    以降に進めなくなります。

    大変お手数ですが、引き続きアドバイス頂けますと嬉しいです。。。!
    よろしくお願いいたします。

    キャンセル

  • 2018/03/08 17:04

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

    キャンセル

  • 2018/03/08 23: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の値にアクセスしようとしています。

    意味不明なこと言っていたらすみません!
    よろしくお願いいたします!

    キャンセル

  • 2018/03/09 06:23

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

    キャンセル

  • 2018/03/10 13: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)

    度々恐れ入りますが、よろしくお願いいたします!!

    キャンセル

  • 2018/03/10 15:39 編集

    {(snapshot) in
    print(snapshot)

    だと何が出てきますでしょうか?

    また、print(dictionary2)の下で
    for d in dictionary2.values {
    print(d)
    print(d["url"])
    }

    と追記すると何か出てきますでしょうか?

    キャンセル

  • 2018/03/10 18: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)

    キャンセル

  • 2018/03/10 20:00

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

    キャンセル

  • 2018/03/11 18:42

    newmtさん、

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

    長いこと教えていただき本当にありがとうございました!!!

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    8937questions

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

  • iOS

    4773questions

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

  • Firebase

    970questions

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

  • TableView

    146questions

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

  • SNS

    116questions

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