【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つ目の変数から対象のデータを参照することができます。
- FIRDataEventTypeChildAdded(.childAdded):値の追加を観測
- FIRDataEventTypeChildChanged(.childChanged):値の変更を観測
- FIRDataEventTypeChildRemoved(.childRemoved):値の削除を観測
- FIRDataEventTypeChildMoved(.childMoved):値の順序を観測
- FIRDataEventTypeValue(.value):値を観測
.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()
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。