Manejar errores de sincronización
Al desarrollar una aplicación que use Sincronización de Dispositivos, debe configurar un controlador de errores. Este controlador detectará y responderá a cualquier llamada a la API relacionada con la sincronización fallida.
Tip
Para obtener una aplicación de ejemplo completa con una implementación de controlador de errores de sincronización funcional,
Cree una aplicación de plantilla y revise el cliente SwiftUI. La implementación del controlador de errores se encuentra en el App.swift archivo.
Para una implementación compatible con SwiftUI de un controlador de errores de sincronización, cree un ObservableObject Con una @Published variable opcional para contener un posible error. Este controlador usa SyncManager para detectar errores. El SyncManager informa errores del tipo SyncError y también otros problemas de conexión.
Para obtener más información, consulte el Objective-C RLMSyncError subyacente.
final class ErrorHandler: ObservableObject { var error: Swift.Error? init(app: RealmSwift.App) { // Sync Manager listens for sync errors. app.syncManager.errorHandler = { error, syncSession in if let error = error as? SyncError { /* Handle specific SyncError cases, or use a switch * statement to handle all Sync error codes. * In this case, ignore a .connectionFailed error and * continue executing the app code. */ if error.code == .connectionFailed { return } self.error = error } else if let error = error as? POSIXError { /* The error handler may also report NSError types to * allow for error handling in a platform-idiomatic way. * In this case, handle a connection timeout error as * an .ETIMEDOUT error in the POSIXError domain. */ if error.code == .ETIMEDOUT { return } self.error = error } } } }
Tip
Para obtener una lista de errores comunes de sincronización de dispositivos y cómo solucionarlos, consulte Errores de sincronización en la documentación de sincronización de dispositivos de App Services.
Inicialice el controlador de errores como @StateObject. Inyéctelo en la jerarquía de vistas como un objeto de entorno. En este ejemplo, mostramos .alert al usuario cuando se produce un error de sincronización.
let app = App(id: flexibleSyncAppId) @main struct realmSwiftUIApp: SwiftUI.App { // Initialize the error handler var errorHandler = ErrorHandler(app: app) var body: some Scene { WindowGroup { NextView(app: app) // Inject the error handler as an environment object .environmentObject(errorHandler) // Display an alert to the user containing the error when a Sync error occurs .alert(Text("Error"), isPresented: .constant(errorHandler.error != nil)) { Button("OK", role: .cancel) { errorHandler.error = nil } } message: { Text(errorHandler.error?.localizedDescription ?? "") } } } }
Luego, en la vista donde observa el dominio App, puede usar el controlador de errores como @EnvironmentObject para reaccionar ante errores de sincronización. Si se produce un error aquí, se genera una alerta para el usuario, utilizando el .alert establecido en la vista anterior.
struct NextView: View { var app: RealmSwift.App // Use the error handler that you injected into the environment var errorHandler: ErrorHandler var body: some View { Text("You might log users in or handle errors in this view") } }