更新内容に合わせて、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 表示している要素を修正する)
Sponsor Link
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 全体での検知
- Collection に対しての検知
- Object に対しての検知
影響範囲を考えて適切な対象の変更検知にすることでパフォーマンスも良くすることができます。
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link