Handle Sync Errors - SwiftUI
On this page
Handle Sync Errors
While developing an application that uses Device Sync, set an error handler. This error handler detects and responds to any failed sync-related API calls.
Tip
See also:
For a complete example app with a working Sync error handler implementation,
create a template app and check out
the SwiftUI client. The error handler
implementation is in the App.swift
file.
For a SwiftUI-friendly implementation of a Sync error handler, create
an ObservableObject
with an optional @Published
variable to contain
a potential error. This handler uses the SyncManager to listen for errors.
The SyncManager
reports errors of the type SyncError
, and it also
reports other connection issues.
For more information, refer to the underlying Objective-C RLMSyncError.
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
For a list of common Device Sync errors and how to handle them, refer to Sync Errors in the App Services Device Sync documentation.
Initialize the error handler as a @StateObject
. Inject it into the
view hierarchy as an environment object. In this example, we display an
.alert
to the user when a Sync error occurs.
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 ?? "") } } } }
Then, in the view where you are observing the SDK App
, you can use the
error handler as an @EnvironmentObject
to react to Sync errors. An
error that occurs here pops up an alert for the user, using the .alert
set in the view above.
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") } }