ProjeçãoObservável
public protocol ProjectionObservable : AnyObject, ThreadConfined
Um tipo de projeção apagada.
ProjectionObservable é um editor Combine
-
O tipo subjacente da projeção - um filho de Realm
Object
ouEmbeddedObject
.Declaração
Swift
associatedtype Root : RLMObjectBase
-
O objeto sendo projetado
Declaração
Swift
var rootObject: Root { get }
-
observe(keyPaths:
Método de extensãoon: _: ) 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 objetoPerson
subjacente da projeção, mas não para quaisquer alterações feitas na listaPerson.lastName
ouPerson.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 dofirstName
da listafriends
trigger o bloqueio. Uma alteração emsomeFriend.lastName
não trigger o bloqueio (ondesomeFriend
é um elemento contido emfriends
)
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
eResults
, 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 objetoProjection
“`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.
- O bloco de notificação acima é acionado para alterações na propriedade
-
observe(keyPaths:
Método de extensãoon: _: ) 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 listalastName
oufriends
. Se o caminho da chave observado for
[\PersonProjection.firstFriendsName]
, qualquer inserção, exclusão ou modificação dofirstName
da listafriends
trigger o bloqueio. Uma alteração emsomeFriend.lastName
não trigger o bloqueio (ondesomeFriend
é um elemento contido emfriends
)
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
eResults
, 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.
- O bloco de notificação acima é acionado para alterações na propriedade
-
observe(keyPaths:
Método de extensão, assíncronoon: _: ) 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 objetoPerson
subjacente da projeção, mas não para quaisquer alterações feitas na listaPerson.lastName
ouPerson.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 dofirstName
da listafriends
trigger o bloqueio. Uma alteração emsomeFriend.lastName
não trigger o bloqueio (ondesomeFriend
é um elemento contido emfriends
)
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.
- O bloco de notificação acima é acionado para alterações na propriedade
-
observe(keyPaths:
Método de extensão, assíncronoon: _: ) 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 objetoPerson
subjacente da projeção, mas não para quaisquer alterações feitas na listaPerson.lastName
ouPerson.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 dofirstName
da listafriends
trigger o bloqueio. Uma alteração emsomeFriend.lastName
não trigger o bloqueio (ondesomeFriend
é um elemento contido emfriends
)
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.
- O bloco de notificação acima é acionado para alterações na propriedade