post Image
[ios]firebaseを使用したデータ取得について

現在、開発でfirebaseを使用しているのですが、どうしてもデータの構造になれなくて、つまづくことが多かったので、メモ。
例えば、下記のようなデータの構造があるとする。
スクリーンショット 2017-12-14 1.22.58.png
この場合、「Group」以下を取り出すのは比較的簡単。

sample.swift
//この「ref」でこのツリー全体のrootを示す。
ref = Database.database().reference()
//refの下に「child()」で場所を示す。今回の場合は「Group」
ref.child("Gruop").observe(.value, with: { (snapshot) in
            中略・・・

私が今回、つまづいたのは「Group」の下にある一つブロックのその下にぶら下がっている(今回であれがusers)を取得する場合。

sample.swift
ref = Database.database().reference()
//refの下に「child()」で場所を示す。今回の場合は「Group」
ref.child("Gruop").observe(.value, with: { (snapshot) in

            for itemSnapShot in snapshot.children {
                //ここで取得したデータを自分で定義したデータ型に入れて、加工する
                let item = GroupData(snapshot: itemSnapShot as! DataSnapshot)
                                 ・・・中略

                }
            }

で、自分で定義したデータ型がこちら。
let dict にfirebaseで取得したデータを入れて、あとは取り出したい項目ごとにデータを加工。

GroupData.swift
class GroupData {

    var ref: DatabaseReference?
    var groupid: String?
    var name: String?
    var founder: String?
    var memberofnumber: Int?
    var payment: Int?
    var period: String?
    var message: String?
    var publicnum: Int?
    var groupprofile: String?
    var users : Array? = []

    init? (snapshot: DataSnapshot) {
        ref = snapshot.ref
        guard let dict = snapshot.value as? [String:Any] else { return nil }
        guard let groupid  = ref?.key  else { return nil }
        guard let name  = dict["name"] as? String  else { return nil }
        guard let founder = dict["founder"]  as? String else { return nil }
        guard let memberofnumber = dict["memberofnumber"]  as? Int else { return nil }
        guard let payment = dict["payment"]  as? Int else { return nil }
        guard let period = dict["period"]  as? String else { return nil }
        guard let message = dict["message"] as? String else { return nil }
        guard let publicnum = dict["publicnum"] as? Int else { return nil }
        guard let groupprofile = dict["groupprofile"] as? String else { return nil }
         guard let users = dict["users"] as? [String:AnyObject] else { return nil }
        var newusers : Array? = []

        for i in users.keys {
            newusers?.append(i)
        }

        self.name = name
        self.groupid = groupid
        self.founder = founder
        self.memberofnumber = memberofnumber
        self.payment = payment
        self.period = period
        self.message = message
        self.publicnum = publicnum
        self.groupprofile = groupprofile
        self.users = newusers


    }

}

自分は「users(ツリー上ののぶら下がっているブロック)」を配列として取得したかったので、配列として取得したところ、うまくいかず・・
データの型を [String:AnyObject]で宣言することで、keysで一つ一つのkeyを取得できたので、あとは配列に入れておしまい。
言葉にして説明しようとすると、うまく伝えられない。。。。


『 Swift 』Article List