ProjeçãoObservável

public protocol ProjectionObservable : AnyObject, ThreadConfined

Um tipo de projeção apagada.

ProjectionObservable é um editor Combine

ProjeçãoObservável

  • observe(keyPaths:on:_:) Método de extensão

    Registra um bloco a ser chamado sempre que o objeto subjacente da projeção for alterado.

    O bloco será chamado de forma assíncrona após cada transação de escrita que exclui o objeto subjacente ou modifica qualquer uma das propriedades projetadas do objeto, incluindo auto-atribuições que definem uma propriedade para seu valor existente.

    Para transações de gravação realizadas em diferentes threads ou em processos diferentes, o bloco será chamado quando o Realm de gerenciamento for (auto)atualizado para uma versão que inclua as alterações, enquanto para transações de gravação local, ele será chamado em algum momento no futuro após o a transação de escrita está confirmada.

    Se nenhum caminho de chave for fornecido, o bloco será executado em qualquer inserção, modificação ou exclusão para todas as propriedades projetadas, incluindo propriedades projetadas de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:

    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
       // ...
    })
    
    • O bloco de notificação acima é acionado para alterações na propriedade Person.firstName do objeto Person subjacente da projeção, mas não para quaisquer alterações feitas na lista Person.lastName ou Person.friends .
    • O bloco de notificação é acionado para alterações da propriedade PersonProjection.name , mas não para a alteração de propriedade de outra projeção.
    • Se o caminho da chave observado for ["firstFriendsName"], qualquer inserção, exclusão ou modificação do firstName da lista friends trigger o bloqueio. Uma alteração em someFriend.lastName não trigger o bloqueio (onde someFriend é um elemento contido em friends)

    Observação

    Vários tokens de notificação no mesmo objeto que filtram exclusivamente caminhos de chave separados não filtram. Se uma alteração de caminho-chavefor satisfeita para um token de notificação, todos os bloqueios de token de notificação para esse objeto serão executados.

    Se nenhuma fila for fornecida, as notificações serão entregues por meio do loop de eventos padrão e, portanto, não poderão ser entregues enquanto o loop de eventos estiver bloqueado por outra atividade. Se uma fila for fornecida, as notificações serão entregues para essa fila. Quando as notificações não podem ser entregues instantaneamente, várias notificações podem ser agrupadas em uma única notificação.

    Ao contrário de List e Results, não há chamada de resposta "inicial" feita após você adicionar um novo bloco de notificação.

    Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para invalidate() no token.

    É seguro capturar uma forte referência ao objeto observado dentro do bloco de chamada de resposta. Não há ciclo de retenção devido ao fato de que a chamada de resposta é retida pelo token retornado e não pelo próprio objeto.

    Aviso

    Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.

    Aviso

    Para propriedades projetadas em que a propriedade original tem o mesmo nome de propriedade raiz, isso trigger um PropertyChange para cada uma das propriedades projetadas, mesmo que a alteração corresponda apenas a uma delas. Para o seguinte objeto Projection “`swift classe PersonProjection: Projection { @Projected(\Person.firstName) nome da var @Projected(\Person.address.country) originCountry @Projected(\Person.address.phone.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"
       }
       ```
    

    Declaração

    Swift

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

    Parâmetros

    keyPaths

    Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se nil, notificações serão entregues para qualquer alteração de propriedade projetada no objeto. Os caminhos da chave da string que não correspondem a uma propriedade projetada válida lançarão uma exceção.

    queue

    A fila de despacho em série para receber a notificação. Se nil, as notificações são entregues ao thread atual.

    block

    O bloco a ser chamado com informações sobre as alterações no objeto.

    Valor de retorno

    Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.

  • observe(keyPaths:on:_:) Método de extensão

    Registra um bloco a ser chamado sempre que o objeto subjacente da projeção for alterado.

    O bloco será chamado de forma assíncrona após cada transação de escrita que exclui o objeto subjacente ou modifica qualquer uma das propriedades projetadas do objeto, incluindo auto-atribuições que definem uma propriedade para seu valor existente.

    Para transações de gravação realizadas em diferentes threads ou em processos diferentes, o bloco será chamado quando o Realm de gerenciamento for (auto)atualizado para uma versão que inclua as alterações, enquanto para transações de gravação local, ele será chamado em algum momento no futuro após o a transação de escrita está confirmada.

    Se nenhum caminho de chave for fornecido, o bloco será executado em qualquer inserção, modificação ou exclusão para todas as propriedades projetadas, incluindo propriedades projetadas de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:

    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
       // ...
    })
    
    • O bloco de notificação acima é acionado para alterações na propriedade firstName do objeto, mas não para quaisquer alterações feitas na lista lastName ou friends .
    • Se o caminho da chave observado for [\PersonProjection.firstFriendsName], qualquer inserção, exclusão ou modificação do firstName da lista friends trigger o bloqueio. Uma alteração em someFriend.lastName não trigger o bloqueio (onde someFriend é um elemento contido em friends)

    Observação

    Vários tokens de notificação no mesmo objeto que filtram exclusivamente caminhos de chave separados não filtram. Se uma alteração de caminho-chavefor satisfeita para um token de notificação, todos os bloqueios de token de notificação para esse objeto serão executados.

    Se nenhuma fila for fornecida, as notificações serão entregues por meio do loop de eventos padrão e, portanto, não poderão ser entregues enquanto o loop de eventos estiver bloqueado por outra atividade. Se uma fila for fornecida, as notificações serão entregues para essa fila. Quando as notificações não podem ser entregues instantaneamente, várias notificações podem ser agrupadas em uma única notificação.

    Ao contrário de List e Results, não há chamada de resposta "inicial" feita após você adicionar um novo bloco de notificação.

    Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para invalidate() no token.

    É seguro capturar uma forte referência ao objeto observado dentro do bloco de chamada de resposta. Não há ciclo de retenção devido ao fato de que a chamada de resposta é retida pelo token retornado e não pelo próprio objeto.

    Aviso

    Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.

    Declaração

    Swift

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

    Parâmetros

    keyPaths

    Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se nil, notificações serão entregues para qualquer alteração de propriedade projetada no objeto. Os caminhos da chave da string que não correspondem a uma propriedade projetada válida lançarão uma exceção.

    queue

    A fila de despacho em série para receber a notificação. Se nil, as notificações são entregues ao thread atual.

    block

    O bloco a ser chamado com informações sobre as alterações no objeto.

    Valor de retorno

    Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.

  • observe(keyPaths:on:_:) Método de extensão, assíncrono

    Registra um bloco a ser chamado sempre que o objeto subjacente da projeção for alterado.

    O bloqueio será chamado de forma assíncrona no ator após cada transação de gravação que exclua o objeto subjacente ou modifique qualquer uma das propriedades projetadas do objeto, incluindo auto-atribuições que definem uma propriedade para seu valor existente.

    Para transações de gravação realizadas em diferentes threads ou em processos diferentes, o bloco será chamado quando o Realm de gerenciamento for (auto)atualizado para uma versão que inclua as alterações, enquanto para transações de gravação local, ele será chamado em algum momento no futuro após o a transação de escrita está confirmada.

    Se nenhum caminho de chave for fornecido, o bloco será executado em qualquer inserção, modificação ou exclusão para todas as propriedades projetadas, incluindo propriedades projetadas de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:

    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
       // ...
    })
    
    • O bloco de notificação acima é acionado para alterações na propriedade Person.firstName do objeto Person subjacente da projeção, mas não para quaisquer alterações feitas na lista Person.lastName ou Person.friends .
    • O bloco de notificação é acionado para alterações da propriedade PersonProjection.name , mas não para a alteração de propriedade de outra projeção.
    • Se o caminho da chave observado for ["firstFriendsName"], qualquer inserção, exclusão ou modificação do firstName da lista friends trigger o bloqueio. Uma alteração em someFriend.lastName não trigger o bloqueio (onde someFriend é um elemento contido em friends)

    As notificações são entregues a uma função isolada do ator específico, no executor do ator. Se o ator estiver realizando um trabalho de bloqueio, várias notificações podem ser agrupadas em uma única notificação.

    Ao contrário das notificações de coleção, não há notificação "Inicial" e não há lacuna entre o momento em que essa função retorna e o momento em que as alterações serão capturadas pela primeira vez.

    Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para invalidate() no token.

    Aviso

    Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.

    Declaração

    Swift

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

    Parâmetros

    keyPaths

    Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se nil, notificações serão entregues para qualquer alteração de propriedade projetada no objeto. Os caminhos da chave da string que não correspondem a uma propriedade projetada válida lançarão uma exceção.

    actor

    O ator para o qual as notificações devem ser entregues. O bloco é passado esse ator como um parâmetro isolado, permitindo que você acesse o ator de forma síncrona a partir da chamada de resposta.

    block

    O bloco a ser chamado com informações sobre as alterações no objeto.

    Valor de retorno

    Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.

  • observe(keyPaths:on:_:) Método de extensão, assíncrono

    Registra um bloco a ser chamado sempre que o objeto subjacente da projeção for alterado.

    O bloqueio será chamado de forma assíncrona no ator após cada transação de gravação que exclua o objeto subjacente ou modifique qualquer uma das propriedades projetadas do objeto, incluindo auto-atribuições que definem uma propriedade para seu valor existente.

    Para transações de gravação realizadas em diferentes threads ou em processos diferentes, o bloco será chamado quando o Realm de gerenciamento for (auto)atualizado para uma versão que inclua as alterações, enquanto para transações de gravação local, ele será chamado em algum momento no futuro após o a transação de escrita está confirmada.

    Se nenhum caminho de chave for fornecido, o bloco será executado em qualquer inserção, modificação ou exclusão para todas as propriedades projetadas, incluindo propriedades projetadas de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:

    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
       // ...
    })
    
    • O bloco de notificação acima é acionado para alterações na propriedade Person.firstName do objeto Person subjacente da projeção, mas não para quaisquer alterações feitas na lista Person.lastName ou Person.friends .
    • O bloco de notificação é acionado para alterações da propriedade PersonProjection.name , mas não para a alteração de propriedade de outra projeção.
    • Se o caminho da chave observado for [\.firstFriendsName], qualquer inserção, exclusão ou modificação do firstName da lista friends trigger o bloqueio. Uma alteração em someFriend.lastName não trigger o bloqueio (onde someFriend é um elemento contido em friends)

    As notificações são entregues a uma função isolada do ator específico, no executor do ator. Se o ator estiver realizando um trabalho de bloqueio, várias notificações podem ser agrupadas em uma única notificação.

    Ao contrário das notificações de coleção, não há notificação "Inicial" e não há lacuna entre o momento em que essa função retorna e o momento em que as alterações serão capturadas pela primeira vez.

    Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para invalidate() no token.

    Aviso

    Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.

    Declaração

    Swift

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

    Parâmetros

    keyPaths

    Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se nil, notificações serão entregues para qualquer alteração de propriedade projetada no objeto. Os caminhos da chave da string que não correspondem a uma propriedade projetada válida lançarão uma exceção.

    actor

    O ator para o qual as notificações devem ser entregues. O bloco é passado esse ator como um parâmetro isolado, permitindo que você acesse o ator de forma síncrona a partir da chamada de resposta.

    block

    O bloco a ser chamado com informações sobre as alterações no objeto.

    Valor de retorno

    Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.