Managed uma sessão de sincronização - C++ SDK
Nesta página
Quando você usa o Atlas Device Sync, o Realm C++ SDK sincroniza os dados com o Atlas em segundo plano usando uma sessão de sincronização. A sessão de sincronização começa quando você abre um domínio sincronizado.
A sessão de sincronização managed o seguinte:
Carregar e baixar alterações no Realm
Monitoramento do estado de sincronização
Pré-requisitos
Antes de managed um estado de sessão de sincronização, você deve:
Obter a sessão de sincronização
Você pode usar a função de nó get_sync_session() para obter um objeto sync_session para qualquer Realm sincronizado. O SDK retorna este objeto como opcional. É um identificador leve que você pode passar por valor.
auto syncSession = realm.get_sync_session();
Verifique a conexão de rede
Dica
O design offline do SDK significa que, geralmente, você não precisa verificar o estado atual da conexão de rede. Dito isto, a propriedade connection_state()
estará disponível se a sua aplicação chamar para obter alguma indicação do estado da conexão.
Para verificar o estado da conexão, você pode ler a propriedade connection_state()
da instância de sessão de sincronização diretamente.
syncSession->connection_state();
Você também pode observar o estado da conexão com a função observe_connection_change() . Essa função registra um retorno de chamada que o SDK invoca quando a sessão de sincronização subjacente altera seu estado de conexão.
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. });
Se você registrar um ouvinte de alteração de conexão, poderá cancelar o registro quando terminar de ouvir as alterações. Ligue para o método uneregister_connection_change_observer() da instância da sessão de sincronização para cancelar o registro de um token de observação.
syncSession->unregister_connection_change_observer(connectionToken);
O estado da conexão de rede é diferente do estado da conexão do Device Sync que você pode verificar com o método state()
. Para obter mais informações sobre o estado da conexão de sincronização, consulte a documentação Verifique o estado de sincronização nesta página.
Pausar ou retomar uma sessão de sincronização
Você pode pausar e retomar a sessão de sincronização no Realm. Pausar uma sessão de sincronização suspende apenas a sessão de sincronização desse realm. Se você tiver mais de um Realm aberto, a suspensão não afetará a sessão de sincronização de outros Realms.
Para pausar uma sessão de sincronização, chame o método pausa() da sessão de sincronização.
syncSession->pause();
Para retomar uma sessão de sincronização, chame o método resume() da sessão de sincronização.
syncSession->resume();
Quando pausar uma sessão de sincronização
Para a maioria dos aplicativos, não é necessário pausar e retomar manualmente uma sessão de sincronização. No entanto, existem algumas circunstâncias em que você pode querer pausar ou suspenso uma sessão de sincronização:
Você só quer sincronizar depois que o usuário executar uma ação específica
Você só deseja sincronizar durante um determinado horário do dia
Você não quer tentar sincronizar quando a conectividade de rede estiver ruim
Você deseja forçar explicitamente uma sessão de sincronização para se conectar
No caso de uma conectividade de rede ruim, tentar continuamente estabelecer uma conexão de rede pode esgotar a bateria do dispositivo do usuário.
O caso de forçar explicitamente uma sessão de sincronização para se conectar é mais comumente relacionado a estar offline por algum tempo. O cliente de sincronização tenta se conectar e, em caso de falha, entra em backoff exponencial. After being offline for a long time, the client may not immediately reconnect. Pausar e retomar a sessão de sincronização força explicitamente a conexão.
Ao pausar uma sessão de sincronização, lembre-se do seguinte:
Se o cliente ficar offline por mais tempo do que o tempo máximo offline do cliente , o cliente não conseguirá retomar a sincronização e deverá fazer um reinício do cliente.
Pausar uma sessão de sincronização a pausa em ambas as direções. As alterações feitas pelo seu aplicativo no dispositivo não são sincronizadas com o backend, e as alterações nos dados no backend ou em outros dispositivos não são sincronizadas com o dispositivo. Não há como pausar apenas uploads ou pausar apenas downloads.
Não pause uma sessão de sincronização se quiser que um cliente pare permanentemente de sincronizar com o backend. Para parar permanentemente a sincronização, copie o conteúdo do Realm sincronizado em um Realm não sincronizado e use o Realm não sincronizado no cliente.
Não pause a sincronização para parar a sincronização por períodos indefinidos ou intervalos de tempo em meses e anos. A funcionalidade não foi projetada ou testada para esses casos de uso. Você pode encontrar uma série de problemas ao usá-lo dessa forma.
Aguarde as alterações para fazer upload e download
Você pode usar os métodos wait_for_upload_completion()
e wait_for_download_completion()
de sync_session para aguardar as alterações para fazer upload ou download do Atlas. Ambos os métodos podem, opcionalmente, receber uma chamada de resposta de resposta para ser executado quando o upload ou o download for concluído.
Para aguardar todas as alterações para carregar no Atlas a partir do seu Realm sincronizado, use a função de membro wait_for_upload_completion()
.
syncSession->wait_for_upload_completion().get();
Para aguardar o download de todas as alterações do Atlas em seu Realm sincronizado, use a função de membro wait_for_download_completion()
. Atualize o Realm depois de baixar quaisquer alterações para ter certeza de que ele reflete os dados mais recentes.
syncSession->wait_for_download_completion().get(); realm.refresh();
Verifique o estado de sincronização
Você pode usar a função de membro público state()
do sync_session para verificar se a sessão de sincronização está ativa. Isso retorna um enum cujo valor reflete possíveis estados do Device Sync.
syncSession->state();
O estado da conexão de sincronização é diferente do estado da conexão de rede que você pode verificar com o método connection_state()
. Para obter mais informações sobre o estado da conexão de rede, consulte a documentação Verificar a conexão de rede nesta página.
Reconectar manualmente todas as sessões de sincronização
O Realm detecta automaticamente quando um dispositivo recupera a conectividade depois de estar offline e tenta se reconectar usando uma estratégia de backoff incremental.
Você pode optar por trigger manualmente uma tentativa de reconexão com o método reconnect() de uma sessão de sincronização em vez de esperar pela duração do backoff incremental. Isso é útil se você tiver uma compreensão mais precisa das condições da rede e não quiser confiar na detecção automática de reconexão do Realm.
syncSession->reconnect();
Quando você chama esse método, o SDK força todas as sessões de sincronização a tentar se reconectar imediatamente. Isso redefine todos os temporizadores usados para backoff incremental.
Chamar esse método não garante que o dispositivo possa se reconectar. Se o SDK receber um erro fatal ou se o dispositivo já estiver conectado ou tentando se conectar, chamar esse método não terá efeito.
Importante
Não é possível reconectar dentro da duração do tempo limite de leitura do soquete
O Realm tem um tempo limite de leitura de soquete padrão interno de 2 minutos, onde o Realm atingirá o tempo limite se uma operação de leitura não receber nenhum dado dentro de uma janela de 2 minutos. Se você chamar reconnect()
dentro dessa janela, o SDK não tentará se reconectar.