【Swift】Firebaseからデータを順番に取り出す

 

解説

 

・過去の記事で、Firebaseからデータを取得する方法を紹介した

nekokichi2yos2.hatenablog.com

 

・しかし、上記の方法では、取り出すデータの順番がバラバラになってしまう

 

・そこで、今回は順番に取り出す方法を紹介する

・データを投稿順に(昇順に)ソートする場合、ソートするためのデータを保存しなくても、データの階層(childByAutoId)でソートできる

・childByAutoId()は乱数の階層を生成するが、sorter()メソッドを使用すれば、登録順にデータをソートしてくれる 

・下記のデータベースを例にする場合、

f:id:nekokichi_yos2:20181109150637p:plain

  1. let snapdata = snap.value as? [String:NSDictionary]で、全ての階層を取得
  2. for key in snapdata!.keys.sorted() {} で、変数keyに階層を順に代入していく
  3. let snap = snapdata![key]で、階層内にある全てのデータを辞書でsnapに代入
  4. if let roomname = snap!["RoomName"] as? String {} で、roomnameに"RoomName"のキーで保存された値("はわはわ")を代入

という流れになる。

 

チャットアプリや掲示板アプリなどを作る際、是非とも参考にしてくれたまえ。

 

ソースコード

 

//Firebaseからルーム一覧を取得する
    func loadData_Firebase() {
        //Databaseの参照URLを取得
        let ref = Database.database().reference()
        //データ取得開始
        ref.child("post").child("RoomList").observeSingleEvent(of: .value) { (snap, error) in
            //RoomList下の階層をまとめて取得
            let snapdata = snap.value as? [String:NSDictionary]
            //データを取得する配列
            self.roomArray = [String]()
            //もしデータがなければ無反応
            if snapdata == nil {
                return
            }
            //snapdata!.keys : 階層
            //key : 階層
            for key in snapdata!.keys.sorted() {
                //snap : 階層下のデータを書くのすいた辞書
                //今回なら、snap = ["RoomName":"はわはわ"]
                let snap = snapdata![key]
                if let roomname = snap!["RoomName"] as? String {
                    self.roomArray.append(roomname)
                }
            }
        }
    }