[Swift] [Realm] Realm でのデータ更新通知まとめ

     

TAGS:

⌛️ < 1 min.
Realm を使ったときに限らず、アプリケーション内部のデータ更新に合わせて、UI 表示も更新しないといけません。

更新内容に合わせて、UI も更新できると効率的です。Realm では、どのような通知を受け取れるかまとめてみます。

なお、サンプルのコードは以下の記事のものを引き継いで使っています。

[SwiftUI][Realm][Xcode12] Realm を使ったアプリの開発方法(その1 : 要素作成)

[SwiftUI][Realm][Xcode12] Realm を使ったアプリの開発方法(その2 : 要素編集)

[SwiftUI][Realm][Xcode12] Realm を使ったアプリの開発方法(その3 : UNDO/REDO 実装)

[SwiftUI][Realm][Xcode12] Realm を使ったアプリの開発方法(その4: List 表示している要素を修正する)

Realm での通知

Realm では、以下の3種類があります。

  • realm への変更を通知
  • コレクションへの変更を通知
  • オブジェクトへの変更を通知

なお、Realm のドキュメントは、こちら

realm への変更通知

通知条件

realm にたいして、何らかの変更があったときに通知されます。

通知設定方法

以下のように設定します。

通知設定コード


 let token = realm.observe({ (notification:Realm.Notification, realm) in
   print("realm is updated")
 })

(Later)
 token.invalidate()

通知情報

struct である Realm.Notification が渡されてきます。

情報としては、”didChange” か “refreshRequired” という情報のみが渡されてきます。

Realm のドキュメントは、こちら

この通知をきっかけに、UI のアップデート等を行うことが可能です。

コレクションへの変更通知

通知条件

Query 等を行った Results や List 等のコレクションに対して、何らかの変更があったときに通知されます。

通知設定方法

以下のように設定します。

通知設定コード


 // textLineList は、List と定義されています
 let token = textLineList.observe({ (change:RealmCollectionChange) in
   print("list is updated:")
 })

(Later)
 token.invalidate()

通知情報

変更は、RealmCollectionChange という enum で渡されてきます。
.initial, .update, .error の3種類があり、.update には、deletions, insertions, modifications という追加情報があります。
.update 時の deletions, insertions, modifications には、コレクションのインデックスの配列が渡されてきて、どの要素が、削除/追加/変更 されたのかをインデックスを通して知ることができます。

Realm のドキュメントは、こちら

オブジェクトへの変更通知

通知条件

1要素にたいして、何らかの変更があったときに通知されます。

通知設定方法

以下のように設定します。

通知設定コード


 // textLineList は、List と定義されています
 let firstObject = textLineList[0]
 firstObject.observe({ (change:ObjectChange) in
   print("first object is updated: ")
 })

(Later)
 token.invalidate()

通知情報

変更は、ObjectChange という enum で渡されてきます。
.error, .change, .deleted の3種類があり、.change には、変更されたプロパティの情報が、 PropertyChange という struct の配列で渡されてきます。

Realm のドキュメントは、こちら

まとめ

Realm での変更操作に対しては、以下の単位で変更を検知できる
  • Realm 全体での検知
  • Collection に対しての検知
  • Object に対しての検知

影響範囲を考えて適切な対象の変更検知にすることでパフォーマンスも良くすることができます。

説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です