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 de Projectionterá o mesmo nome e tipo que o objeto original. Consulte PersonProjection.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 do Object projetado . Consulte PersonProjection.lastNameCaps e PersonProjection.homeCity.
  • Collection mapping - List e MutableSetde Objects ou EmbeddedObjects podem ser projetados como uma collection de valores primitivos. Consulte PersonProjection.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 o Projection. Você ainda pode acessar o Object ou EmbeddedObject 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)

Disponível onde Root: ThreadConfined

  • 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 objeto ThreadConfined .

    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. Consulte Realm.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 }