【Swift/Firebase】observeメソッドの使い方!Realtime Database

【Swift/Firebase】observeメソッドの使い方!Realtime Database

この記事からわかること

  • Swift/Firebase作成したiOSアプリRealtime Databaseデータを観測する方法
  • observeメソッド使い方
  • 観測停止させるremoveAllObserversの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

FirebaseのRealtime DatabaseをSwiftで取り扱う場合に使用するobserveメソッドの使い方をまとめていきます。

observeメソッドとは?

公式ドキュメント:Appleプラットフォームでデータのリストを操作する

observeメソッドとはFirebase Realtime Databaseのデータベースを観測(observe)するメソッドです。このメソッドは初期の呼び出し時とサーバーの値が更新されたタイミングに毎回実行されます。しかしツリー状のルートを指定し呼び出すと全ての変更を観測することになるため、必要な深さまでを指定しアタッチするのが推奨されています。

observe(eventType: DataEventType, with: (DataSnapshot) -> Void)

更新を検知できるのはFIRDataEventType型の値で定義されているイベントです。1つ目の引数に観測するイベントを指定し、2つ目の変数から対象のデータを参照することができます。

.valueを指定すると値に対するあらゆる変更を観測します。

使用方法

observeメソッドは最初に一度呼び出せばあとは自動で更新タイミングで実行してくれるのでSwift UIならonAppear、UIKitならviewDidAppearなどの中で呼び出すと良いかもしれません。

例えばusersノード以下のあらゆる値の変更を観測するには以下のようになります。snapshot格納されるのはusers以下の階層のデータです。

.onAppear{
    ref.child("users").observe(.value) { snapshot in
        print("値が変更されました: \(snapshot.value as AnyObject)")
    }
}

さらに新規のデータを書き込む処理を実装していた場合、このボタンが押下されるたびobserveメソッドは呼ばれます。

Button(action: {
    ref.child("users").childByAutoId().setValue(["useername":"ame","age":25])
}, label: {
    Text("Add")
}).padding()

removeAllObserversメソッド

observeメソッドを一度実行するとアプリが停止するまで観測が続行されてしまいます。観測を明示的に停止させるにはremoveAllObserversメソッドを使用します。

例えば先ほどのようにusersノードを観測している場合は、そのノードからremoveAllObserversメソッドを呼び出します

ref.child("users").observe(.value) { snapshot in
    print("値が変更されました: \(snapshot.value as AnyObject)")
}
ref.child("users").removeAllObservers()

観測は停止させることができますが、データを一度だけ取得したい場合getDataメソッドを使用します。

ref.child("users").getData(completion:  { error, snapshot in
    guard error == nil else {
        print(error!.localizedDescription)
        return
    }
    if let dic = snapshot?.value as? [String:AnyObject]{
        self.userName = dic["username"] as? String ?? "Unknown"
    }
})

全ての観測を停止させる

removeAllObserversメソッドを対象のノードではなく、ルートから呼び出すことでその子ノード全てに対して観測を解除することが可能です。

ref.removeAllObservers()

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index