Esta guía de inicio rápido muestra cómo usar Realm con el SDK de Swift. Antes de comenzar, asegúrese de tener instalado el SDK de Swift.
Tip
Si su aplicación utiliza SwiftUI, consulte el Inicio rápido de SwiftUI.
Reino de importación
Cerca de la parte superior de cualquier archivo Swift que use Realm, agregue la siguiente declaración de importación:
import RealmSwift
Define tu modelo de objeto
Para un dominio solo local, puede definir su modelo de objetos directamente en el código. En esta guía de inicio rápido, puede eliminar
ownerId a menos que desee agregar la sincronización de dispositivo opcional.
class Todo: Object { (primaryKey: true) var _id: ObjectId var name: String = "" var status: String = "" var ownerId: String convenience init(name: String, ownerId: String) { self.init() self.name = name self.ownerId = ownerId } }
Abrir un reino
En un reino solo local, la opción más sencilla para abrir un reino es usar el reino predeterminado sin ningún parámetro de configuración:
// Open the local-only default realm let realm = try! Realm()
También puede especificar un Parámetro Realm.Configuration para abrir un reino en una URL de archivo específica, en memoria o con un subconjunto de clases.
Para obtener más información, consulte: Configurar y abrir un reino.
Crear, leer, actualizar y eliminar objetos
Una vez que haya abierto un reino, puede modificarlo y modificar sus objetos en un bloque de transacción de escritura.
Para crear un nuevo objeto Todo, se debe crear una instancia de la clase Todo y agregarla al realm en un bloque de escritura:
let todo = Todo(name: "Do laundry", ownerId: user.id) try! realm.write { realm.add(todo) }
Puedes recuperar una colección en vivo de todos los tareas pendientes en el reino:
// Get all todos in the realm let todos = realm.objects(Todo.self)
También puedes filtrar esa colección usando donde:
let todosInProgress = todos.where { $0.status == "InProgress" } print("A list of all todos in progress: \(todosInProgress)")
Para modificar una tarea, actualice sus propiedades en un bloque de transacción de escritura:
// All modifications to a realm must happen in a write block. let todoToUpdate = todos[0] try! realm.write { todoToUpdate.status = "InProgress" }
Por último, puedes borrar un todo:
// All modifications to a realm must happen in a write block. let todoToDelete = todos[0] try! realm.write { // Delete the Todo. realm.delete(todoToDelete) }
Esté atento a los cambios
Puede observar un reino, una colección o un objeto en busca de cambios con el observe método.
// Retain notificationToken as long as you want to observe let notificationToken = todos.observe { (changes) in switch changes { case .initial: break // Results are now populated and can be accessed without blocking the UI case .update(_, let deletions, let insertions, let modifications): // Query results have changed. print("Deleted indices: ", deletions) print("Inserted indices: ", insertions) print("Modified modifications: ", modifications) case .error(let error): // An error occurred while opening the Realm file on the background worker thread fatalError("\(error)") } }
Asegúrese de conservar el token de notificación devuelto por observe mientras desee continuar observando. Al finalizar la observación, invalide el token para liberar los recursos:
// Invalidate notification tokens when done observing notificationToken.invalidate()
Agregar sincronización de dispositivos (opcional)
Si desea sincronizar datos de Realm entre dispositivos, puede configurar una aplicación de Servicios de App Atlas y habilitar la sincronización de dispositivos. Para obtener más información sobre las funciones de Servicios de App, consulte: Servicios de App - Swift SDK.
Requisitos previos
Antes de poder sincronizar los datos de Realm, debes:
Inicializar la aplicación
Para usar las funciones de App Services, como la autenticación y la sincronización, accede a tu aplicación de App Services con tu ID de aplicación. Puedes encontrarlo en la interfaz de App Services.
let app = App(id: APP_ID) // Replace APP_ID with your Atlas App ID
Autenticar un usuario
En esta guía de inicio rápido, usará la autenticación anónima para iniciar sesión sin que los usuarios proporcionen información de identificación. Tras autenticar al usuario, podrá abrir un dominio para él.
do { let user = try await app.login(credentials: Credentials.anonymous) print("Successfully logged in user: \(user)") await openSyncedRealm(user: user) } catch { print("Error logging in: \(error.localizedDescription)") }
El SDK de Swift de Realm ofrece muchas maneras adicionales de autenticar, registrar y vincular usuarios. Para conocer otros proveedores de autenticación, consulte: Autenticar usuarios - SDK de Swift
Abrir un reino
Una vez que haya habilitado la Sincronización de dispositivos y autenticado a un usuario, puede crear un objeto de configuración y abrir el dominio. A continuación, puede agregar una suscripción de Sincronización flexible que determine qué datos puede leer y escribir el dominio.
Una vez que tenga un reino con una suscripción, este ejemplo pasa el reino y el usuario a otra función donde puede usar el reino.
Tip
Si su aplicación accede a Realm en un contexto async/await, marque el código con @MainActor para evitar fallas relacionadas con subprocesos.
// Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func openSyncedRealm(user: User) async { do { var config = user.flexibleSyncConfiguration() // Pass object types to the Flexible Sync configuration // as a temporary workaround for not being able to add a // complete schema for a Flexible Sync app. config.objectTypes = [Todo.self] let realm = try await Realm(configuration: config, downloadBeforeOpen: .always) // You must add at least one subscription to read and write from a Flexible Sync realm let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append( QuerySubscription<Todo> { $0.ownerId == user.id }) } await useRealm(realm: realm, user: user) } catch { print("Error opening realm: \(error.localizedDescription)") } }
La sintaxis para leer, escribir y observar cambios en un dominio sincronizado es idéntica a la sintaxis para dominios no sincronizados descrita anteriormente. Mientras trabaja con datos locales, un hilo en segundo plano integra, carga y descarga conjuntos de cambios de forma eficiente.
Cada transacción de escritura para un conjunto de suscripciones tiene un coste de rendimiento. Si necesita realizar varias actualizaciones a un objeto de Realm durante una sesión, considere mantener los objetos editados en memoria hasta que se completen todos los cambios. Esto mejora el rendimiento de la sincronización al escribir solo el objeto completo y actualizado en su reino, en lugar de cada cambio.