Conceptos: Modelos de objetos y relaciones
Modeling data for SwiftUI builds on the same object model and relationship concepts in the Swift SDK. If you are unfamiliar with Realm Swift SDK data modeling concepts, see: Define a Realm Object Model - Swift SDK.
Vincular el modelo de objeto a la interfaz de usuario
El patrón de diseño Modelo-Vista-ViewModel (MVVM) defiende la creación de un modelo de vista que abstraiga el modelo del código de Vista. Si bien ciertamente puede hacerlo con Realm, el SDK de Swift proporciona herramientas que facilitan trabajar directamente con sus datos en vistas SwiftUI. Estas herramientas incluyen cosas como:
Envoltorios de propiedades que crean enlaces a objetos observables subyacentes
Una clase para proyectar y transformar objetos del modelo subyacente para su uso en vistas específicas
Transformación de datos para vistas de SwiftUI
El SDK de Realm Swift proporciona un tipo especial de objeto, llamado Proyección: para transformar y trabajar con subconjuntos de datos. Considere una proyección similar a un modelo de vista. Permite pasar por las propiedades del objeto original o transformarlas de diferentes maneras:
Passthrough: The projection's property has the same name and type as the original object.
Cambiar nombre: La propiedad de la proyección tiene el mismo tipo que el objeto original, pero un nombre diferente.
Resolución de ruta clave: use esto para acceder a propiedades específicas del objeto proyectado.
Mapeo de colecciones: puede mapear algunos tipos de colecciones a una colección de valores primitivos.
Exclusión: Todas las propiedades del objeto Realm original no definidas en el modelo de proyección. Cualquier cambio en dichas propiedades no activa una notificación de cambio al observar la proyección.
Cuando se utiliza una proyección, se obtienen todos los beneficios de los objetos activos de Realm:
The class-projected object live updates
Puedes observar los cambios.
You can apply changes directly to the properties in write transactions
Definir un nuevo objeto
Puedes definir un objeto Realm derivando de la clase Objeto o ObjetoIntegrado. El nombre de la clase se convierte en el nombre de la tabla en el realm, y las propiedades de la clase se conservan en la base de datos. Esto hace que sea tan fácil trabajar con objetos persistidos como trabajar con objetos regulares de Swift.
The Realm SwiftUI documentation uses a model for a fictional app, DoggoDB. This app is a company directory of employees who have dogs. It lets people share a few details about their dogs with other employees.
El modelo de datos incluye un objeto Persona, con una relación de varios con los objetos Perro de esa persona. También utiliza un tipo de dato especial del SDK de Swift de Realm, PersistableEnum, para almacenar información sobre la unidad de negocio de la persona.
class Person: Object, ObjectKeyIdentifiable { (primaryKey: true) var _id: ObjectId 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 { (primaryKey: true) var _id: UUID var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() (originProperty: "dogs") var person: LinkingObjects<Person> var firstLetter: String { guard let char = name.first else { return "" } return String(char) } }
Tip
For complete details about defining a Realm object model, see:
Define a Projection
Nuestra aplicación ficticia DoggoDB tiene una vista de perfil de usuario. Esta vista muestra algunos detalles sobre la persona, pero no necesitamos todas sus propiedades. Person Modelo. Podemos crear una proyección con solo los detalles que queramos. También podemos modificar la lastName propiedad para usar solo la inicial del apellido.
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 }
We can use this projection in the Profile view instead of the original Person object.
La proyección de clase funciona con envoltorios de propiedades SwiftUI:
Tip
Para obtener un ejemplo completo del uso de una proyección de clase en una aplicación SwiftUI, consulte la aplicación de ejemplo Proyecciones.