ProjectionObservable

public protocol ProjectionObservable : AnyObject, ThreadConfined

プロジェクションを削除したタイプ。

ProjectionObservable は 組み合わせ パブリッシャー

ProjectionObservable

  • observe(keyPaths:on:_:) 拡張メソッド

    プロジェクションの基礎となるオブジェクトが変更されるたびに呼び出されるブロックを登録します。

    ブロックは、基礎となるオブジェクトを削除するか、プロパティを既存の値に設定する自己割り当てを含む、オブジェクトのプロジェクションされたプロパティのいずれかを変更する各書込みトランザクションの後に非同期に呼び出されます。

    異なるスレッドまたは異なるプロセスで実行される書込みトランザクションの場合、ブロックは管理 Realm が変更を含むバージョンに(自動)更新されたときに呼び出されますが、ローカルの書込みトランザクションでは、将来のある時点で呼び出されます書込みトランザクション (write transaction) がコミットされた場合。

    キー パスが指定されていない場合、ブロックは、ネストされたリンクされたオブジェクトのプロジェクションされたプロパティを含む、すべてのプロジェクションされたプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:

    class Person: Object {
        @Persisted var firstName: String
        @Persisted var lastName = ""
        @Persisted public var friends: List<Person>
    }
    
    class PersonProjection: Projection<Person> {
        @Projected(\Person.firstName) var name
        @Projected(\Person.lastName.localizedUppercase) var lastNameCaps
        @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String>
    }
    
    let token = projectedPerson.observe(keyPaths: ["name"], { changes in
       // ...
    })
    
    • 上記の通知ブロックは、プロジェクションの基礎となるPersonオブジェクトのPerson.firstNameプロパティに対する変更に対して起動しますが、 Person.lastNameまたはPerson.friendsリストに加えられた変更に対しては起動しません。
    • 通知ブロックは、 PersonProjection.nameプロパティの変更に対して起動されますが、別のプロジェクションのプロパティ変更に対しては起動しません。
    • 確認されたキー パスが ["firstFriendsName"] の場合、friends リストの firstName の挿入、削除、または変更によってブロックがtriggerされます。 someFriend.lastName への変更ではブロックはtriggerされません(someFriendfriends に含まれる要素です)

    注意

    個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。

    キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。

    ListResultsとは異なり、新しい通知ブロックを追加した後に実行される初期コールバックはありません。

    アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンでinvalidate()を呼び出します。

    コールバック ブロック内で監視対象オブジェクトへの強力な参照をキャプチャしても安全です。 コールバックはオブジェクト自体ではなく返されたトークンによって保持されるため、保持サイクルがありません。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    警告

    元のプロパティが同じルート プロパティ名を持つプロジェクション プロパティの場合、変更が 1 つのみにのみ対応している場合でも、各プロジェクション プロパティに対して PropertyChange がtriggerされます。 次のProjectionオブジェクトの場合、`swift クラスの proper別のプロジェクション: プロジェクション{ @Projected(\Performance.firstName) 変数名 @Projected(\Password.address.country) orgions @Projected(\Performance.hostname.number) mobile }

       let token = projectedPerson.observe { changes in
           if case .change(_, let propertyChanges) = changes {
               propertyChanges[0].newValue as? String, "Winterfell" // Will notify the new value
               propertyChanges[1].newValue as? String, "555-555-555" // Will notify with the current value, which hasn't change.
           }
       })
    
       try realm.write {
           person.address.country = "Winterfell"
       }
       ```
    

    宣言

    Swift

    public func observe(keyPaths: [String]? = nil,
                        on queue: DispatchQueue? = nil,
                        _ block: @escaping (ObjectChange<Self>) -> Void) -> NotificationToken

    パラメーター

    keyPaths

    キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。 nilの場合、オブジェクトにプロジェクションされるプロパティの変更に対して通知が配信されます。 有効なプロジェクション プロパティに対応しないstringキー パスは例外をスローします。

    queue

    通知を受信するシリアル ディスパッチ キュー。 nilの場合、通知は現在のスレッドに配信されます。

    block

    オブジェクトに対する変更に関する情報を呼び出すブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。

  • observe(keyPaths:on:_:) 拡張メソッド

    プロジェクションの基礎となるオブジェクトが変更されるたびに呼び出されるブロックを登録します。

    ブロックは、基礎となるオブジェクトを削除するか、プロパティを既存の値に設定する自己割り当てを含む、オブジェクトのプロジェクションされたプロパティのいずれかを変更する各書込みトランザクションの後に非同期に呼び出されます。

    異なるスレッドまたは異なるプロセスで実行される書込みトランザクションの場合、ブロックは管理 Realm が変更を含むバージョンに(自動)更新されたときに呼び出されますが、ローカルの書込みトランザクションでは、将来のある時点で呼び出されます書込みトランザクション (write transaction) がコミットされた場合。

    キー パスが指定されていない場合、ブロックは、ネストされたリンクされたオブジェクトのプロジェクションされたプロパティを含む、すべてのプロジェクションされたプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:

    class Person: Object {
        @Persisted var firstName: String
        @Persisted var lastName = ""
        @Persisted public var friends: List<Person>
    }
    
    class PersonProjection: Projection<Person> {
        @Projected(\Person.firstName) var name
        @Projected(\Person.lastName.localizedUppercase) var lastNameCaps
        @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String>
    }
    
    let token = projectedPerson.observe(keyPaths: [\PersonProjection.name], { changes in
       // ...
    })
    
    • 上記の通知ブロックは、オブジェクトのfirstNameプロパティの変更に対しては起動しますが、 lastNameまたはfriendsリストに加えられた変更に対しては起動しません。
    • 確認されたキー パスが [\PersonProjection.firstFriendsName] の場合、friends リストの firstName の挿入、削除、または変更によってブロックがtriggerされます。 someFriend.lastName への変更ではブロックはtriggerされません(someFriendfriends に含まれる要素です)

    注意

    個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。

    キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。

    ListResultsとは異なり、新しい通知ブロックを追加した後に実行される初期コールバックはありません。

    アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンでinvalidate()を呼び出します。

    コールバック ブロック内で監視対象オブジェクトへの強力な参照をキャプチャしても安全です。 コールバックはオブジェクト自体ではなく返されたトークンによって保持されるため、保持サイクルがありません。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    宣言

    Swift

    public func observe(keyPaths: [PartialKeyPath<Self>],
                        on queue: DispatchQueue? = nil,
                        _ block: @escaping (ObjectChange<Self>) -> Void) -> NotificationToken

    パラメーター

    keyPaths

    キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。 nilの場合、オブジェクトにプロジェクションされるプロパティの変更に対して通知が配信されます。 有効なプロジェクション プロパティに対応しないstringキー パスは例外をスローします。

    queue

    通知を受信するシリアル ディスパッチ キュー。 nilの場合、通知は現在のスレッドに配信されます。

    block

    オブジェクトに対する変更に関する情報を呼び出すブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。

  • observe(keyPaths:on:_isolation:_:) 拡張メソッド、非同期

    プロジェクションの基礎となるオブジェクトが変更されるたびに呼び出されるブロックを登録します。

    ブロックは、基礎となるオブジェクトを削除するか、プロパティを既存の値に設定する自己割り当てを含む、オブジェクトのプロジェクションされるプロパティを変更する各書き込みトランザクションの後にアクター上で非同期に呼び出されます。

    異なるスレッドまたは異なるプロセスで実行される書込みトランザクションの場合、ブロックは管理 Realm が変更を含むバージョンに(自動)更新されたときに呼び出されますが、ローカルの書込みトランザクションでは、将来のある時点で呼び出されます書込みトランザクション (write transaction) がコミットされた場合。

    キー パスが指定されていない場合、ブロックは、ネストされたリンクされたオブジェクトのプロジェクションされたプロパティを含む、すべてのプロジェクションされたプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:

    class Person: Object {
        @Persisted var firstName: String
        @Persisted var lastName = ""
        @Persisted public var friends: List<Person>
    }
    
    class PersonProjection: Projection<Person> {
        @Projected(\Person.firstName) var name
        @Projected(\Person.lastName.localizedUppercase) var lastNameCaps
        @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String>
    }
    
    let token = projectedPerson.observe(keyPaths: ["name"], { changes in
       // ...
    })
    
    • 上記の通知ブロックは、プロジェクションの基礎となるPersonオブジェクトのPerson.firstNameプロパティに対する変更に対して起動しますが、 Person.lastNameまたはPerson.friendsリストに加えられた変更に対しては起動しません。
    • 通知ブロックは、 PersonProjection.nameプロパティの変更に対して起動されますが、別のプロジェクションのプロパティ変更に対しては起動しません。
    • 確認されたキー パスが ["firstFriendsName"] の場合、friends リストの firstName の挿入、削除、または変更によってブロックがtriggerされます。 someFriend.lastName への変更ではブロックはtriggerされません(someFriendfriends に含まれる要素です)

    通知は、指定されたアクターの実行プログラム上の、そのアクターに分離された関数に配信されます。 アクターがブロッキング作業を実行している場合、複数の通知が 1 つの通知に統合されることがあります。

    コレクション通知とは異なり、「初期」通知はなく、この関数が返されるまでと変更が最初にキャプチャされるまでの間に差はありません。

    アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンでinvalidate()を呼び出します。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    宣言

    Swift

    @available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *)
    public func observe<A: Actor>(
        keyPaths: [String]? = nil, on actor: A,
        _isolation: isolated (any Actor)? = #isolation,
        _ block: @Sendable @escaping (isolated A, ObjectChange<Self>) -> Void
    ) async -> NotificationToken

    パラメーター

    keyPaths

    キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。 nilの場合、オブジェクトにプロジェクションされるプロパティの変更に対して通知が配信されます。 有効なプロジェクション プロパティに対応しないstringキー パスは例外をスローします。

    actor

    通知を配信するアクター。 The block is passed this actor as an isolated parameter, allowing you to access the actor synchronously from within the callback.

    block

    オブジェクトに対する変更に関する情報を呼び出すブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。

  • observe(keyPaths:on:_isolation:_:) 拡張メソッド、非同期

    プロジェクションの基礎となるオブジェクトが変更されるたびに呼び出されるブロックを登録します。

    ブロックは、基礎となるオブジェクトを削除するか、プロパティを既存の値に設定する自己割り当てを含む、オブジェクトのプロジェクションされるプロパティを変更する各書き込みトランザクションの後にアクター上で非同期に呼び出されます。

    異なるスレッドまたは異なるプロセスで実行される書込みトランザクションの場合、ブロックは管理 Realm が変更を含むバージョンに(自動)更新されたときに呼び出されますが、ローカルの書込みトランザクションでは、将来のある時点で呼び出されます書込みトランザクション (write transaction) がコミットされた場合。

    キー パスが指定されていない場合、ブロックは、ネストされたリンクされたオブジェクトのプロジェクションされたプロパティを含む、すべてのプロジェクションされたプロパティの挿入、変更、または削除時に実行されます。 キー パスが指定されている場合、指定されたキー パスでのみ発生する変更に対してブロックが呼び出されます。 たとえば、次の場合:

    class Person: Object {
        @Persisted var firstName: String
        @Persisted var lastName = ""
        @Persisted public var friends: List<Person>
    }
    
    class PersonProjection: Projection<Person> {
        @Projected(\Person.firstName) var name
        @Projected(\Person.lastName.localizedUppercase) var lastNameCaps
        @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String>
    }
    
    let token = projectedPerson.observe(keyPaths: [\PersonProjection.name], { changes in
       // ...
    })
    
    • 上記の通知ブロックは、プロジェクションの基礎となるPersonオブジェクトのPerson.firstNameプロパティに対する変更に対して起動しますが、 Person.lastNameまたはPerson.friendsリストに加えられた変更に対しては起動しません。
    • 通知ブロックは、 PersonProjection.nameプロパティの変更に対して起動されますが、別のプロジェクションのプロパティ変更に対しては起動しません。
    • 確認されたキー パスが [\.firstFriendsName] の場合、friends リストの firstName の挿入、削除、または変更によってブロックがtriggerされます。 someFriend.lastName への変更ではブロックはtriggerされません(someFriendfriends に含まれる要素です)

    通知は、指定されたアクターの実行プログラム上の、そのアクターに分離された関数に配信されます。 アクターがブロッキング作業を実行している場合、複数の通知が 1 つの通知に統合されることがあります。

    コレクション通知とは異なり、「初期」通知はなく、この関数が返されるまでと変更が最初にキャプチャされるまでの間に差はありません。

    アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンでinvalidate()を呼び出します。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    宣言

    Swift

    @available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *)
    public func observe<A: Actor>(
        keyPaths: [PartialKeyPath<Self>], on actor: A,
        _isolation: isolated (any Actor)? = #isolation,
        _ block: @Sendable @escaping (isolated A, ObjectChange<Self>) -> Void
    ) async -> NotificationToken

    パラメーター

    keyPaths

    キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。 nilの場合、オブジェクトにプロジェクションされるプロパティの変更に対して通知が配信されます。 有効なプロジェクション プロパティに対応しないstringキー パスは例外をスローします。

    actor

    通知を配信するアクター。 The block is passed this actor as an isolated parameter, allowing you to access the actor synchronously from within the callback.

    block

    オブジェクトに対する変更に関する情報を呼び出すブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。