Al usar Atlas Device Sync, el SDK de Realm C++ sincroniza los datos con Atlas en segundo plano mediante una sesión de sincronización. Esta sesión se inicia al abrir un dominio sincronizado.
La sesión de sincronización gestiona lo siguiente:
Cargar y descargar cambios en el reino
Supervisión del estado de sincronización
Requisitos previos
Antes de poder administrar un estado de sesión de sincronización, debe:
Obtener la sesión de sincronización
Puedes usar la función miembro get_sync_session() para obtener un objeto sync_session para cualquier dominio sincronizado. El SDK devuelve este objeto como opcional. Es un identificador ligero que puedes pasar por valor.
auto syncSession = realm.get_sync_session();
Compruebe la conexión de red
Tip
El diseño sin conexión del SDK significa que, por lo general, no es necesario verificar el estado actual de la conexión de red. Dicho esto,
connection_state() La propiedad está disponible si su aplicación requiere alguna indicación del estado de la conexión.
Para comprobar el estado de la conexión, puede leer connection_state() directamente la propiedad de la instancia de la sesión de sincronización.
syncSession->connection_state();
También se puede observar el estado de la conexión con la función observe_connection_change(). Esta función registra una función de retorno que el SDK invoca cuando la sesión de sincronización subyacente cambia su estado de conexión.
auto connectionToken = syncSession->observe_connection_change( [&](enum realm::sync_session::connection_state, enum realm::sync_session::connection_state new_state) { // Register a block to execute when connection state changes. });
Si registra un detector de cambios de conexión, puede anular su registro al finalizar la escucha de cambios. Llame al método unregister_connection_change_observer() de la instancia de sesión de sincronización para anular el registro de un token de observación.
syncSession->unregister_connection_change_observer(connectionToken);
El estado de la conexión de red es distinto del estado de la conexión de sincronización del dispositivo, que se puede comprobar con el método state(). Para obtener más información sobre el estado de la conexión de sincronización, consulte la documentación "Comprobar el estado de sincronización" en esta página.
Pausar o reanudar una sesión de sincronización
Puedes pausar y reanudar la sesión de sincronización en el reino. Pausar una sesión de sincronización solo suspende la sesión de sincronización de ese reino. Si tienes más de un reino abierto, la suspensión no afecta las sesiones de sincronización de los demás reinos.
Para pausar una sesión de sincronización, llame al método pause() de la sesión de sincronización.
syncSession->pause();
Para reanudar una sesión de sincronización, llama al método resume() de la sesión de sincronización.
syncSession->resume();
Cuándo pausar una sesión de sincronización
En la mayoría de las aplicaciones, no es necesario pausar y reanudar manualmente una sesión de sincronización. Sin embargo, existen algunas circunstancias en las que podría ser conveniente pausar o suspender una sesión de sincronización:
Solo desea sincronizar después de que el usuario realice una acción específica
Solo desea sincronizar durante un momento determinado del día.
No debes intentar sincronizar cuando hay una mala conectividad de red
Quiere forzar explícitamente una sesión de sincronización para conectarse
En el caso de una mala conectividad de red, intentar continuamente establecer una conexión de red puede agotar la batería del dispositivo del usuario.
El caso de forzar explícitamente la conexión de una sesión de sincronización suele estar relacionado con estar desconectado durante un tiempo. El cliente de sincronización intenta conectarse y, al fallar, entra en una fase de desconexión exponencial. Tras un tiempo prolongado desconectado, es posible que el cliente no se vuelva a conectar inmediatamente. Pausar y reanudar la sesión de sincronización fuerza explícitamente la conexión.
Cuando pause una sesión de sincronización, tenga en cuenta lo siguiente:
Si el cliente puede estar fuera de línea por un tiempo mayor al máximo permitido, no podrá reanudar la sincronización y deberá reiniciarlo.
Pausar una sesión de sincronización la pausa en ambos sentidos. Los cambios que realiza la aplicación en el dispositivo no se sincronizan con el backend, y los cambios en los datos del backend o de otros dispositivos no se sincronizan con el dispositivo. No es posible pausar solo las cargas ni las descargas.
No pause una sesión de sincronización si desea que un cliente deje de sincronizarse permanentemente con el backend. Para ello, copie el contenido del dominio sincronizado en uno no sincronizado y utilice este último en el cliente.
No pause la sincronización para detenerla por períodos indefinidos o intervalos de tiempo de meses o años. Esta función no está diseñada ni probada para estos casos de uso. Podría experimentar diversos problemas al usarla de esta manera.
Espera a que los cambios se suban y se descarguen
Puede usar los wait_for_upload_completion() wait_for_download_completion() métodos y de sync_session para esperar a que los cambios se carguen o descarguen de Atlas. Ambos métodos pueden, opcionalmente, recibir una devolución de llamada para ejecutarse al finalizar la carga o descarga.
Para esperar a que todos los cambios se carguen en Atlas desde su reino sincronizado, utilice la función miembro wait_for_upload_completion().
syncSession->wait_for_upload_completion().get();
Para esperar a que todos los cambios de Atlas se descarguen en el dominio sincronizado, use la función miembro wait_for_download_completion(). Actualice el dominio después de descargar cualquier cambio para asegurarse de que refleje los datos más recientes.
syncSession->wait_for_download_completion().get(); realm.refresh();
Comprobar el estado de sincronización
Puede usar la función miembro pública de sync_session state() para comprobar si la sesión de sincronización está activa. Esto devuelve una enumeración cuyo valor refleja los posibles estados de sincronización del dispositivo.
syncSession->state();
El estado de la conexión de sincronización es distinto del estado de la conexión de red, que se puede comprobar con el método connection_state(). Para obtener más información sobre el estado de la conexión de red, consulte la documentación "Comprobar la conexión de red" en esta página.
Reconectar manualmente todas las sesiones de sincronización
Realm detecta automáticamente cuando un dispositivo recupera la conectividad después de estar fuera de línea e intenta reconectarse utilizando una estrategia de retroceso incremental.
Puedes optar por activar manualmente un intento de reconexión con el método reconnect() de una sesión de sincronización en lugar de esperar a que finalice la interrupción incremental. Esto es útil si tienes una comprensión más precisa de las condiciones de la red y no quieres depender de la detección automática de reconexión de Realm.
syncSession->reconnect();
Al llamar a este método, el SDK fuerza a todas las sesiones de sincronización a intentar reconectarse inmediatamente. Esto restablece los temporizadores utilizados para la interrupción incremental.
Llamar a este método no garantiza que el dispositivo pueda reconectarse. Si el SDK recibe un error fatal, o si el dispositivo ya está conectado o intenta conectarse, llamar a este método no tiene ningún efecto.
Importante
No se puede reconectar dentro del tiempo de espera de lectura del socket
Realm tiene un tiempo de espera de lectura de socket predeterminado interno de minutos. Realm agotará el tiempo de espera 2 si una operación de lectura no recibe datos en un 2plazo de minutos. Si se llama reconnect() a dentro de ese plazo, el SDK no intenta reconectarse.