RealmSectionedResult
public protocol RealmSectionedResult : ThreadConfined, Equatable, RandomAccessCollection
RealmSectionedResult
は、 SectionedResults
とResultSection
に共通のプロパティとメソッドを定義します。
-
コレクションを管理する Realm、またはコレクションが無効になっている場合は
nil
。宣言
Swift
var realm: Realm? { get }
-
コレクションがアクセスできなくなっているかどうかを示します。
コレクションを管理する
Realm
でinvalidate()
が呼び出された場合、コレクションにアクセスできなくなります。宣言
Swift
var isInvalidated: Bool { get }
-
コレクション内のオブジェクトの数。
宣言
Swift
var count: Int { get }
-
このコレクションが固定されている場合は true を返します
宣言
Swift
var isFrozen: Bool { get }
-
このコレクションの固定(不変)スナップショットを返します。
固定されたコピーは、このコレクションに現在含まれているデータと同じデータを含む不変のコレクションですが、含まれている Realm への書込み (write) が行われても更新されません。 ライブコレクションとは異なり、固定コレクションには任意のスレッドからアクセスできます。
警告
このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。警告
Realm で書込みトランザクションを実行中に固定されたコレクションを長時間保持すると、Realm ファイルのサイズが大きくなる可能性があります。 詳しくは、Realm.Configuration.maximumNumberOfActiveVersions
を参照してください。宣言
Swift
func freeze() -> Self
-
この固定されたコレクションのライブ(可変)バージョンを返します。
このメソッドは、同じ固定コレクションのライブ コピーへの参照を解決します。 ライブ コレクションで呼び出されると、 は自分自身を返します。
宣言
Swift
func thaw() -> Self?
-
observe(keyPaths:
デフォルトの実装on: _: ) セクション化された結果のコレクションが変更されるたびに呼び出されるブロックを登録します。
ブロックは最初のセクション化された結果のコレクションとは非同期に呼び出され、セクション化された結果コレクション内のいずれかのオブジェクト、またはセクション化された結果コレクション内のどのオブジェクトを変更するたびに、再度呼び出されます。
ブロックに渡される
change
パラメータは、各書込みトランザクション中に追加、削除、または変更されたオブジェクトをコレクション内のインデックスの形式で報告します。 提供される変更情報の詳細と、その変更情報を使用してUITableView
をアップデートする方法の例については、SectionedResultsChange
のドキュメントを参照してください。ブロックが呼び出される時点で、コレクションは完全に評価され、最新の状態になります。また、同じスレッドで書込みトランザクションを実行したり、
realm.refresh()
を明示的に呼び出したりしない限り、アクセスに関するブロッキングは実行されません動作する。キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。 これには、最初のセクション化された結果コレクションに 通知を含めることができます。
たとえば、次のコードは通知ブロックを追加した後すぐに書込みトランザクションを実行するため、最初の通知が最初に配信される可能性はありません。 その結果、最初の通知には、書込みトランザクション後の Realm の状態が反映されます。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
キー パスが指定されていない場合、ブロックは、すべてのオブジェクト プロパティとネストされたリンクされたオブジェクトのプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 確認されたキー パスが
["toys.brand"]
の場合、コレクションの要素の いずれか にあるtoys
リストへの挿入または削除によってブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
値を変更すると、ブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
以外の値を変更しても、ブロックはtriggerされません。 監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 - 上記の例で
["toys"]
キー パスが確認された場合、コレクション内の任意の要素のtoys
リストへの挿入、削除、または変更によってブロックがtriggerされます。 このコレクション内の にリンクされているToy
Dog
の値を変更しても、ブロックはtrigger され ません 。監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 セクション キー パス プロパティを変更すると、セクション内のオブジェクトの位置が変更されたり、セクションが完全に変更されたりすると、通知がtriggerされます。
注意
個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。
アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンで
invalidate()
を呼び出します。警告
このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。
デフォルトの実装
宣言
Swift
func observe(keyPaths: [String]?, on queue: DispatchQueue?, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
パラメーター
keyPaths
キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。
nil
の場合、オブジェクトのプロパティ変更に対して通知が配信されます。 有効な プロパティに対応していないstringキー パスでは例外がスローされます。 リンクされたプロパティの詳細については、上記の説明を参照してください。queue
通知を受信するシリアル ディスパッチ キュー。
nil
の場合、通知は現在のスレッドに配信されます。block
変更が発生するたびに呼び出されるブロック。
戻り値
更新を配信する限り保持する必要があるトークン。
- 確認されたキー パスが
-
observe(keyPaths:
デフォルトの実装on: _: ) デフォルトの実装
セクション化された結果のコレクションが変更されるたびに呼び出されるブロックを登録します。
ブロックは最初のセクション化された結果のコレクションとは非同期に呼び出され、セクション化された結果コレクション内のいずれかのオブジェクト、またはセクション化された結果コレクション内のどのオブジェクトを変更するたびに、再度呼び出されます。
ブロックに渡される
change
パラメータは、各書込みトランザクション中に追加、削除、または変更されたオブジェクトをコレクション内のインデックスの形式で報告します。 提供される変更情報の詳細と、その変更情報を使用してUITableView
をアップデートする方法の例については、SectionedResultsChange
のドキュメントを参照してください。ブロックが呼び出される時点で、コレクションは完全に評価され、最新の状態になります。また、同じスレッドで書込みトランザクションを実行したり、
realm.refresh()
を明示的に呼び出したりしない限り、アクセスに関するブロッキングは実行されません動作する。キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。 これには、最初のセクション化された結果コレクションに 通知を含めることができます。
たとえば、次のコードは通知ブロックを追加した後すぐに書込みトランザクションを実行するため、最初の通知が最初に配信される可能性はありません。 その結果、最初の通知には、書込みトランザクション後の Realm の状態が反映されます。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
キー パスが指定されていない場合、ブロックは、すべてのオブジェクト プロパティとネストされたリンクされたオブジェクトのプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 確認されたキー パスが
["toys.brand"]
の場合、コレクションの要素の いずれか にあるtoys
リストへの挿入または削除によってブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
値を変更すると、ブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
以外の値を変更しても、ブロックはtriggerされません。 監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 - 上記の例で
["toys"]
キー パスが確認された場合、コレクション内の任意の要素のtoys
リストへの挿入、削除、または変更によってブロックがtriggerされます。 このコレクション内の にリンクされているToy
Dog
の値を変更しても、ブロックはtrigger され ません 。監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 セクション キー パス プロパティを変更すると、セクション内のオブジェクトの位置が変更されたり、セクションが完全に変更されたりすると、通知がtriggerされます。
注意
個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。
アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンで
invalidate()
を呼び出します。警告
このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。
宣言
Swift
func observe(keyPaths: [PartialKeyPath<Element.Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
パラメーター
keyPaths
キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。
nil
の場合、オブジェクトのプロパティ変更に対して通知が配信されます。queue
通知を受信するシリアル ディスパッチ キュー。
nil
の場合、通知は現在のスレッドに配信されます。block
変更が発生するたびに呼び出されるブロック。
戻り値
更新を配信する限り保持する必要があるトークン。
- 確認されたキー パスが
-
observe(keyPaths:
デフォルトの実装on: _: ) デフォルトの実装
セクション化された結果のコレクションが変更されるたびに呼び出されるブロックを登録します。
ブロックは最初のセクション化された結果のコレクションとは非同期に呼び出され、セクション化された結果コレクション内のいずれかのオブジェクト、またはセクション化された結果コレクション内のどのオブジェクトを変更するたびに、再度呼び出されます。
ブロックに渡される
change
パラメータは、各書込みトランザクション中に追加、削除、または変更されたオブジェクトをコレクション内のインデックスの形式で報告します。 提供される変更情報の詳細と、その変更情報を使用してUITableView
をアップデートする方法の例については、SectionedResultsChange
のドキュメントを参照してください。ブロックが呼び出される時点で、コレクションは完全に評価され、最新の状態になります。また、同じスレッドで書込みトランザクションを実行したり、
realm.refresh()
を明示的に呼び出したりしない限り、アクセスに関するブロッキングは実行されません動作する。キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。 これには、最初のセクション化された結果コレクションに 通知を含めることができます。
たとえば、次のコードは通知ブロックを追加した後すぐに書込みトランザクションを実行するため、最初の通知が最初に配信される可能性はありません。 その結果、最初の通知には、書込みトランザクション後の Realm の状態が反映されます。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
キー パスが指定されていない場合、ブロックは、すべてのオブジェクト プロパティとネストされたリンクされたオブジェクトのプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 確認されたキー パスが
["toys.brand"]
の場合、コレクションの要素の いずれか にあるtoys
リストへの挿入または削除によってブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
値を変更すると、ブロックがtriggerされます。 このコレクション内のDog
にリンクされているToy
のbrand
以外の値を変更しても、ブロックはtriggerされません。 監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 - 上記の例で
["toys"]
キー パスが確認された場合、コレクション内の任意の要素のtoys
リストへの挿入、削除、または変更によってブロックがtriggerされます。 このコレクション内の にリンクされているToy
Dog
の値を変更しても、ブロックはtrigger され ません 。監視対象のDog
型コレクションへの挿入または削除によって通知がtriggerされます。 セクション キー パス プロパティを変更すると、セクション内のオブジェクトの位置が変更されたり、セクションが完全に変更されたりすると、通知がtriggerされます。
注意
個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。
アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンで
invalidate()
を呼び出します。警告
このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。
宣言
Swift
func observe(keyPaths: [PartialKeyPath<Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
パラメーター
keyPaths
キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。
nil
の場合、オブジェクトのプロパティ変更に対して通知が配信されます。queue
通知を受信するシリアル ディスパッチ キュー。
nil
の場合、通知は現在のスレッドに配信されます。block
変更が発生するたびに呼び出されるブロック。
戻り値
更新を配信する限り保持する必要があるトークン。
- 確認されたキー パスが