Realm Object Models - SwiftUI
Nesta página
Conceitos: modelos de objetos e relacionamentos
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.
Vinculando o modelo de objeto à interface do usuário
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
Transformando dados para visualizações do SwiftUI
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
Definir um novo objeto
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 { true) var _id: ObjectId (primaryKey: var firstName = "" var lastName = "" var personId = "" var company = "MongoDB" var businessUnit = BusinessUnitEnum.engineering var profileImageUrl: URL? 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 { true) var _id: UUID (primaryKey: var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() "dogs") var person: LinkingObjects<Person> (originProperty: 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:
Definir uma projeção
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> { Person.firstName) var firstName // Passthrough from original object (\ Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property (\ Person.personId) var personId (\ Person.businessUnit) var businessUnit (\ Person.profileImageUrl) var profileImageUrl (\ 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:
Para obter um exemplo completo do uso de uma projeção de classe em um aplicação SwiftUI, consulte o aplicativo de exemplo Projeções.