Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ / /

Realm Object Models - SwiftUI

Nesta página

  • Conceitos: modelos de objetos e relacionamentos
  • Vinculando o modelo de objeto à interface do usuário
  • Transformando dados para visualizações do SwiftUI
  • Definir um novo objeto
  • Definir uma projeção

A modelagem de dados para a SwiftUI se baseia no mesmo modelo de objetos e dos mesmos conceitos de relacionamento no Swift SDK. Se você não estiver familiarizado com os conceitos de modelagem de dados do Realm Swift SDK , consulte: Definir um Realm Object Model - Swift SDK.

O padrão de design Model-View-ViewModel (MVVM) preconiza a criação de um modelo de visualização que abstrai o modelo do código de visualização. Embora você possa fazer isso com o Realm, o Swift SDK fornece ferramentas que facilitam o trabalho direto com seus dados no SwiftUI Views. Essas ferramentas incluem coisas como:

  • Wrappers de propriedade que criam vinculações com objetos observáveis subjacentes

  • Uma classe para projeto e transformar objetos de modelo subjacentes para uso em visualizações específicas

O Realm Swift SDK fornece um tipo especial de objeto, chamado deprojeção , para transformar e trabalhar com subconjuntos de seus dados. Considere uma projeção semelhante a um modelo de visualização. Ele permite passar ou transformar as propriedades do objeto original de diferentes maneiras:

  • Passagem: a propriedade da projeção tem o mesmo nome e tipo do objeto original.

  • Renomear: a propriedade da projeção tem o mesmo tipo do objeto original, mas outro nome.

  • Resolução de keypath: use para acessar propriedades específicas do objeto projetado.

  • Mapeamento de collection: Você pode mapear alguns tipos de collection para uma collection de valores primitivos.

  • Exclusão: todas as propriedades do objeto de Realm original não definidos no modelo de projeção. Quaisquer alterações nessas propriedades não trigger uma notificação de alteração ao observar a projeção.

Quando você usa uma Projeção, obtém todos os benefícios dos objetos ativos do Realm:

  • As atualizações ao vivo do objeto projetado pela classe

  • Você pode observá-lo em busca de mudanças

  • Você pode aplicar alterações diretamente às propriedades em transações de escrita

Você pode definir um objeto de Realm derivando da classe Objeto ou EmbeddedObject. O nome da classe se torna o nome da tabela no domínio, e as propriedades da classe persistem no banco de dados. Por isso é mais fácil trabalhar com objetos persistentes do que com objetos Swift regulares.

A documentação do Realm SwiftUI usa um modelo para um aplicativo fictício, o DoggoDB. Este aplicativo é um diretório de funcionários da empresa que têm cães. Ele permite que as pessoas compartilhem alguns detalhes sobre seus cães com outros funcionários.

O modelo de dados inclui um objeto Person , com uma relacionamento para-muitos com os objetos Dog dessa pessoa. Ele também usa um tipo de dados especial do Realm Swift SDK , PersistableEnum, para armazenar informações sobre a unidade de negócios da pessoa.

class Person: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var personId = ""
@Persisted var company = "MongoDB"
@Persisted var businessUnit = BusinessUnitEnum.engineering
@Persisted var profileImageUrl: URL?
@Persisted var dogs: List<Dog>
}
enum BusinessUnitEnum: String, PersistableEnum, CaseIterable {
case customerEngineering = "Customer Engineering"
case educationCommunityAndDocs = "Education, Community and Docs"
case engineering = "Engineering"
case financeAndOperations = "Finance and Operations"
case humanResourcesAndRescruiting = "Human Resources and Recruiting"
case management = "Management"
case marketing = "Marketing"
case product = "Product"
case sales = "Sales"
}
class Dog: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id: UUID
@Persisted var name = ""
@Persisted var breed = ""
@Persisted var weight = 0
@Persisted var favoriteToy = ""
@Persisted var profileImageUrl: URL?
@Persisted var dateLastUpdated = Date()
@Persisted(originProperty: "dogs") var person: LinkingObjects<Person>
var firstLetter: String {
guard let char = name.first else {
return ""
}
return String(char)
}
}

Dica

Veja também:

Para obter detalhes completos sobre como definir um modelo de objeto de Realm, consulte:

Nosso aplicativo fictício DoggoDB tem uma visualização de perfil de usuário. Esta visualização mostra alguns detalhes sobre a pessoa, mas não precisamos de todas as propriedades do modelo Person . Podemos criar uma projeção apenas com os detalhes que queremos. Também podemos modificar a propriedade lastName para usar apenas a primeira inicial do sobrenome.

class Profile: Projection<Person> {
@Projected(\Person.firstName) var firstName // Passthrough from original object
@Projected(\Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property
@Projected(\Person.personId) var personId
@Projected(\Person.businessUnit) var businessUnit
@Projected(\Person.profileImageUrl) var profileImageUrl
@Projected(\Person.dogs) var dogs
}

Podemos usar essa projeção na visualização de perfil em vez do objeto Person original.

A projeção de classe funciona com wrappers de propriedade SwiftUI:

Dica

Veja também:

Voltar

Dados do modelo