El Swift SDK proporciona envoltorios de propiedades para abrir un reino de una manera compatible con SwiftUI.
Puede:
Abrir implícitamente un reino con un
defaultConfigurationo especifique una configuración diferente. Esto funciona tanto para dominios sincronizados como no sincronizados.Descargue siempre los cambios antes de abrir un reino sincronizado, cuyo tiempo de espera expira cuando el usuario está desconectado.
Abra un dominio sincronizado incluso cuando un usuario no esté conectado. Es posible que el dominio no tenga los datos más recientes.
Abrir un reino con una configuración
Cuando utiliza @ObservedRealmObject o @ObservedResults, estos contenedores de propiedades abren implícitamente un reino y recuperan los objetos o resultados especificados.
// Implicitly use the default realm's objects(Dog.self) (Dog.self) var dogs
Nota
El @ObservedResults contenedor de propiedad está diseñado para usarse en una vista de SwiftUI. Si desea observar los resultados en un modelo de vista, registre un detector de cambios.
Cuando no se especifica una configuración, estos contenedores de propiedades usan la defaultConfiguration. Puedes establecer la defaultConfiguration globalmente, y los contenedores de propiedades en toda la aplicación usarán esa configuración cuando abran implícitamente un realm.
Puedes proporcionar configuraciones alternativas que los contenedores de propiedades usen para abrir el dominio implícitamente. Esto podría ser útil al usar varias configuraciones en tu aplicación, como cuando tienes una SyncConfiguration y una Configuration local. Para ello, crea configuraciones explícitas. Luego, usa la inyección de entorno para pasar las configuraciones respectivas a las vistas que las necesitan. Al pasar una configuración a una vista donde los contenedores de propiedades abren un dominio, se usa la configuración pasada en lugar defaultConfiguration de.
Abrir un reino sincronizado
Nuevo en la versión 10.12.0.
Estos contenedores de propiedades de SwiftUI abren dominios sincronizados y rellenan vistas. La principal diferencia entre estos contenedores de propiedades radica en si el usuario debe estar conectado:
Para descargar actualizaciones de su aplicación Atlas App Services antes de abrir un dominio, use el contenedor de propiedades @AsyncOpen. Esto requiere que el usuario tenga conexión de red.
Para abrir un dominio sincronizado independientemente de si el usuario tiene conexión de red, utilice el contenedor de propiedades @AutoOpen. Este contenedor de propiedades permite a los desarrolladores diseñar funciones de priorización sin conexión en sus aplicaciones.
Tip
Migrar a la sincronización flexible
Puedes migrar automáticamente el modo de sincronización de dispositivos de App Services de la sincronización basada en particiones a la sincronización flexible. Esto te permite aprovechar las suscripciones y permisos de la sincronización flexible, más expresivos y granulares, para administrar los datos sincronizados que tus usuarios pueden leer y escribir. Para obtener más información, consulta Migrar de la sincronización basada en particiones a la sincronización flexible.
Descargar cambios antes de abrir un reino sincronizado
Utilice el contenedor de propiedades @AsyncOpen para aplicaciones que requieren información actualizada del servidor, como juegos con clasificaciones en vivo que el usuario puede jugar en varios dispositivos. Esto garantiza que el usuario nunca use la aplicación con datos obsoletos.
Nuevo en la versión 10.27.0.
La versión del SDK de Realm Swift 10.27.0 añade versiones de sincronización flexible de los contenedores de propiedades para abrir Realm con SwiftUI. Puedes añadir consultas de suscripción en .onAppear después de abrir el reino.
(appId: flexibleSyncAppId, timeout: 4000) var asyncOpen
Nuevo en la versión 10.28.0.
Puede crear una flexibleSyncConfiguration() con el initialSubscriptions parámetro. Puede usar este parámetro para suscribirse a las consultas de Flexible Sync en la configuración. Si se ejecuta más de una vez (por ejemplo, si se trata de una vista que se recarga periódicamente), compruebe si la suscripción ya existe antes de agregarla. Si se agrega la misma suscripción de nuevo, se generará un error.
// Create a `flexibleSyncConfiguration` with `initialSubscriptions`. // We'll inject this configuration as an environment value to use when opening the realm // in the next view, and the realm will open with these initial subscriptions. let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in let peopleSubscriptionExists = subs.first(named: "people") let dogSubscriptionExists = subs.first(named: "dogs") // Check whether the subscription already exists. Adding it more // than once causes an error. if (peopleSubscriptionExists != nil) && (dogSubscriptionExists != nil) { // Existing subscriptions found - do nothing return } else { // Add queries for any objects you want to use in the app // Linked objects do not automatically get queried, so you // must explicitly query for all linked objects you want to include. subs.append(QuerySubscription<Person>(name: "people")) subs.append(QuerySubscription<Dog>(name: "dogs")) } })
Luego, pase la configuración a la vista que contiene los contenedores de propiedades como un objeto de entorno.
OpenFlexibleSyncRealmView() .environment(\.realmConfiguration, config)
Para ver un ejemplo completo, consulte la Guía de inicio rápido de SwiftUI.
Para abrir un reino con sincronización basada en particiones, agregue un partitionValue al contenedor de propiedades:
(appId: YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var asyncOpen
Este contenedor de propiedades de SwiftUI inicia Realm.asyncOpen() para el usuario actual. Publica estados, representados por la enumeración AsyncOpenState, que se pueden usar para actualizar la vista.
Ejemplo
Este ejemplo ilustra cómo usar @AsyncOpen para abrir un dominio en una vista. Primero, busque un usuario o inicie sesión. Luego, intente abrir el dominio activando AsyncOpenState para mostrar una vista apropiada. Cuando el dominio se abra correctamente, inyéctelo como valor de entorno para rellenar la vista.
/// This view opens a synced realm. struct OpenFlexibleSyncRealmView: View { // We've injected a `flexibleSyncConfiguration` as an environment value, // so `@AsyncOpen` here opens a realm using that configuration. (appId: flexibleSyncAppId, timeout: 4000) var asyncOpen var body: some View { switch asyncOpen { // Starting the Realm.asyncOpen process. // Show a progress view. case .connecting: ProgressView() // Waiting for a user to be logged in before executing // Realm.asyncOpen. case .waitingForUser: ProgressView("Waiting for user to log in...") // The realm has been opened and is ready for use. // Show the content view. case .open(let realm): // Do something with the realm UseRealmView(realm: realm) // The realm is currently being downloaded from the server. // Show a progress view. case .progress(let progress): ProgressView(progress) // Opening the Realm failed. // Show an error view. case .error(let error): ErrorView(error: error) } } }
/// This view opens a synced realm. struct OpenPartitionBasedSyncRealm: View { // @AsyncOpen attempts to connect to the server and download remote changes // before the realm opens. If there is no network connection, // AsyncOpen cannot load changes and the realm does not open. // We can use an empty string as the partitionValue here because we're // injecting the user.id as an environment value from the LoginView. (appId: YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var asyncOpen var body: some View { switch asyncOpen { // Starting the Realm.asyncOpen process. // Show a progress view. case .connecting: ProgressView() // Waiting for a user to be logged in before executing // Realm.asyncOpen. case .waitingForUser: ProgressView("Waiting for user to log in...") // The realm has been opened and is ready for use. // Show the content view. case .open(let realm): // Do something with the realm UseRealmView(realm: realm) // The realm is currently being downloaded from the server. // Show a progress view. case .progress(let progress): ProgressView(progress) // Opening the Realm failed. // Show an error view. case .error(let error): ErrorView(error: error) } } }
Abrir un reino sincronizado sin conexión
Al igual @AsyncOpen que, @AutoOpen intenta descargar actualizaciones antes de abrir el dominio. Sin embargo, si no hay conexión de red disponible, este método abre un dominio con datos en el dispositivo.
Utilice este contenedor de propiedades para aplicaciones en las que no es un problema para el usuario trabajar con datos potencialmente obsoletos, como aplicaciones para tomar notas donde los usuarios deberían poder trabajar con datos en el dispositivo.
(appId: "app_id") var autoOpen
(appId: "app_id", partitionValue: <partition_value>) var autoOpen
Este contenedor de propiedades de SwiftUI intenta descargar actualizaciones antes de abrir un dominio para el usuario actual. Si no hay conexión a internet, este contenedor de propiedades devuelve la versión más reciente del archivo de dominio local para la configuración appId y la sincronización flexible o basada en particiones.
El contenedor de propiedades publica estados, representados por la enumeración AsyncOpenState, que se puede usar para actualizar la vista. Para ver un ejemplo completo, consulte los @AsyncOpen ejemplos de código anteriores.