Swift
Firebase
orderBy

Firebase Realtime Databaseのソート(order by)について swift4

はじめに

RDBに慣れ親しんでいる人にとってFirebase Realtime Databaseは色々な所で詰まると思いますが、その一つがソート(order by)だと思います。

今回はシンプルなチャットAppを想定して下記データ形態とします。
スクリーンショット 2018-05-17 16.44.20.png

昇順(ASC)でソート(order by)する方法

messageModel.swift
            Database.database().reference().ref.child("messages").child("groupID1")
                .queryOrdered(byChild: "created")
                .observe(.childAdded , with: { snapshot in

                    guard let commentsDict = snapshot.value as? [String: Any] else { return }

                    let sender = commentsDict["sender"] as? String
                    let message = commentsDict["message"] as? String
                    let created = commentsDict["created"] as? Int

                    // data,Messageというオブジェクトを別で定義していますが、今回その部分は割愛します
                    self.data?.append(Message(sender: sender!, message: message!, created: created!))

                })

.queryOrdered(byChild: "created") でcreatedを指定します。
observe の第一引数は .childAdded です。(ここが .value だとソートされません)

降順(DESC)でソート(order by)する方法

実はFirebase側で降順ソートするAPIが存在しません。
その為、少し工夫が必要になります。
messageに「orderCnt」というKeyを作ってInsert時にマイナスに増やします。
そのKeyで上記の昇順ソートをすると結果的に降順になる、という手法です。

スクリーンショット 2018-05-17 17.09.54.png

まとめ

個人的に「降順(DESC)でソート出来ない」「queryOrdered byChildはchildAddedでオブサーブしないといけない」でハマったので今回まとめました。