【Swift】Firebaseからデータを順番に取り出す
解説
・過去の記事で、Firebaseからデータを取得する方法を紹介した
・しかし、上記の方法では、取り出すデータの順番がバラバラになってしまう
・そこで、今回は順番に取り出す方法を紹介する
・データを投稿順に(昇順に)ソートする場合、ソートするためのデータを保存しなくても、データの階層(childByAutoId)でソートできる
・childByAutoId()は乱数の階層を生成するが、sorter()メソッドを使用すれば、登録順にデータをソートしてくれる
・下記のデータベースを例にする場合、
- let snapdata = snap.value as? [String:NSDictionary]で、全ての階層を取得
- for key in snapdata!.keys.sorted() {} で、変数keyに階層を順に代入していく
- let snap = snapdata![key]で、階層内にある全てのデータを辞書でsnapに代入
- 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) } } } }