Projeção
open class Projection<Root> : RealmCollectionValue, ProjectionObservable where Root : RLMObjectBase, Root : RealmCollectionValue, Root : ThreadConfined
extension Projection: KeypathSortable
extension Projection: ThreadConfined where Root: ThreadConfined
extension Projection: ObservableObject, RealmSubscribable where Root: ThreadConfined
Projection
seja um modelo leve do Realm Object
ou EmbeddedObject
original . Você pode usar Projection
como um modelo de visualização para minimizar o código padrão.
Exemplo de uso:
public class Person: Object {
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var address: Address?
@Persisted var friends: List<Person>
@Persisted var reviews: List<String>
}
public class Address: EmbeddedObject {
@Persisted var city: String = ""
@Persisted var country = ""
}
class PersonProjection: Projection<Person> {
@Projected(\Person.firstName) var firstName
@Projected(\Person.lastName.localizedUppercase)
var lastNameCaps
@Projected(\Person.address.city) var homeCity
@Projected(\Person.friends.projectTo.firstName)
var friendsFirstName: ProjectedCollection<String>
}
### Tipos de propriedade suportados
A projeção pode transformar as propriedades originais do @Persisted
de várias maneiras:
Passthrough
- A propriedade deProjection
terá o mesmo nome e tipo que o objeto original. ConsultePersonProjection.firstName
.Rename
- A propriedade da projeção terá o mesmo tipo do objeto original, apenas com o novo nome.Keypath resolution
- você pode acessar certas propriedades doObject
projetado . ConsultePersonProjection.lastNameCaps
ePersonProjection.homeCity
.Collection mapping
-List
eMutableSet
deObject
s ouEmbeddedObject
s podem ser projetados como uma collection de valores primitivos. ConsultePersonProjection.friendsFirstName
.Exclusion
- todas as propriedade do Objeto de Realm original que não foram definidas no modelo de projeção serão excluídas da projeção. Quaisquer alterações ocorridas na propriedade não trigger uma notificação de alteração para oProjection
. Você ainda pode acessar oObject
ouEmbeddedObject
original e observar as notificações diretamente nele.
Observação
cada propriedade@Persisted
pode ser @Projected
de maneiras diferentes na mesma classe de projeção. Each Object
or EmbeddedObject
can have sevaral projections of same or different classes at once.
Consultando
Você pode recuperar todas as projeção de um determinado tipo de um Realm chamando o objects(_:)
do Realm ou init(projecting:)
da classe da projeção:
let projections = realm.object(PersonProjection.self)
let personObject = realm.create(Person.self)
let singleProjection = PersonProjection(projecting: personObject)
-
O objeto sendo projetado
Declaração
Swift
public let rootObject: Root
-
Crie uma nova projeção.
Declaração
Swift
public required init(projecting object: Root)
Parâmetros
object
O objeto a ser projetado.
-
O Realm que managed o objeto ou
nil
se o objeto não for gerenciado. Observação: a Projection pode ser instanciada somente para os managed objeto, portanto, o Realm nunca será nulo. Objetos não gerenciados não estão confinados a um thread e não podem ser passados para métodos que esperam um objetoThreadConfined
.Declaração
Swift
public var realm: Realm? { get }
-
Indica se o objeto não pode mais ser acessado porque agora é inválido.
Declaração
Swift
public var isInvalidated: Bool { get }
-
Indica se o objeto está congelado. Objetos congelados não estão confinados ao thread de origem. Formar um
ThreadSafeReference
para um objeto congelado é permitido, mas é improvável que seja útil.Declaração
Swift
public var isFrozen: Bool { get }
-
Retorna um snapshot congelado deste objeto. Ao contrário dos objetos ativos normais do Realm, a cópia congelada pode ser lida de qualquer thread, e os valores lidos nunca serão atualizados para refletir as novas gravações no Realm. As collection congeladas podem ser query como qualquer outra collection do Realm. Objeto congelados não podem ser mutados e não podem ser observados para notificações de alteração. Objeto de Realm não gerenciados não podem ser congelados.
Aviso
Manter um objeto congelado por um longo período enquanto executa a transação de escrita no Realm pode fazer com que o Arquivo de Realm cresça para tamanhos grandes. ConsulteRealm.Configuration.maximumNumberOfActiveVersions
para obter mais informações.Declaração
Swift
public func freeze() -> Self
-
Retorna uma referência ativa (mutável) deste objeto. Retornará a si mesmo se for chamado em um objeto já ativo.
Declaração
Swift
public func thaw() -> `Self`?
-
Um editor que emite vazio cada vez que a projeção muda.
Apesar do nome, isso realmente é emitido depois que a projeção muda.
Declaração
Swift
public var objectWillChange: RealmPublishers.WillChange<Projection> { get }