質問編集履歴

1 (.childAdded, with: { (snapshot) in

ishicoro

ishicoro score 12

2018/03/09 00:36  投稿

【Swift】Firebaseから複数データ取得
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などがぶら下がっています。
![![イメージ説明](a1755ffea500890edfa5654fdc5da75a.png)
どこをいじればやりたいことが実現できますでしょうか。
アドバイス頂けますととても助かります、、、
よろしくお願いいたします。
```Swift
var audioPlayer: AVAudioPlayer!
Database.database().reference.child("Media_Messages").observe(.childAdded){
          (snapshot:DataSnapshot) in
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 {
           
       }
   
   }
```
  • iOS

    4871 questions

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

  • Swift

    9152 questions

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

  • SNS

    117 questions

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

  • Firebase

    1020 questions

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

  • TableView

    147 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る